BZOJ 1640 [Usaco2007 Nov]Best Cow Line 佇列變換:貪心【字典序最小】

Leohh發表於2017-10-02

題目連結:http://www.lydsy.com/JudgeOnline/problem.php?id=1640

題意:

  給你一個長度為n的字串。

  你可以將原串的首字母或尾字母移動到新串的末尾。

  讓你輸出字典序最小的新串。

 

題解:

  貪心。

 

  三種情況:

    (1)c[head] < c[tail]

      輸出c[head],head++。

    (2)c[head] > c[tail]

      輸出c[tail],tail--。

    (3)c[head] == c[tail]

      選head和tail並不等價。

      比如原串為"CBAC",明顯選tail更優,因為選tail能夠更快地選到'A',讓字典序更小。

      所以需要不斷地"head++,tail--",直到c[head] != c[tail]的時候停止,然後選小的。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAX_N 2005
 5 
 6 using namespace std;
 7 
 8 int n;
 9 int head,tail;
10 char c[MAX_N];
11 
12 int main()
13 {
14     cin>>n;
15     head=0;
16     tail=n-1;
17     for(int i=0;i<n;i++)
18     {
19         cin>>c[i];
20     }
21     for(int i=0;i<n;i++)
22     {
23         if(i!=0 && i%80==0) cout<<endl;
24         if(c[head]<c[tail]) cout<<c[head++];
25         else if(c[head]>c[tail]) cout<<c[tail--];
26         else
27         {
28             int lef=head;
29             int rig=tail;
30             int res=0;
31             while(lef<=rig)
32             {
33                 if(c[lef]<c[rig])
34                 {
35                     res=-1;
36                     break;
37                 }
38                 if(c[lef]>c[rig])
39                 {
40                     res=1;
41                     break;
42                 }
43                 lef++;
44                 rig--;
45             }
46             if(res==0 || res==-1) cout<<c[head++];
47             else cout<<c[tail--];
48         }
49     }
50 }

 

相關文章