BZOJ 1640 [Usaco2007 Nov]Best Cow Line 队列变换:贪心【字典序最小】

题目链接: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 }

 

posted @ 2017-10-02 22:17  Leohh  阅读(120)  评论(0编辑  收藏  举报