題目連結: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 }