问题描述
给定长度为N的字符串S,要构造一个长度为N的字符串T,起初T是一个空串,随后反复进行下列任意操作:
1.从S头部删一个字符加到T尾部
2.从S尾部删一个字符加到T尾部
构造出字典序尽量小的T
思路
字典序的话,前面的字符越小,字典序也就越小,因此尝试让前面的字符尽可能小,有这样的贪心思路,不断从S头或尾取尽可能小的字符添加到T的尾部。
注意坑点:一定要匹配输入的一个空字符,否则也会算在字符串内
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define MAXN 2020 6 char s[MAXN]; 7 int main(){ 8 int N; 9 while(scanf("%d",&N)!=EOF){ 10 for(int i=0;i<N;i++){ 11 scanf(" %c",&s[i]); 12 } 13 int tag=0; 14 int l=0,r=N-1; 15 while(l<=r){ 16 bool flag=false; 17 for(int i=0;l+i<=r;i++){ 18 if(s[l+i]<s[r-i]){ 19 flag=true; 20 break; 21 }else if(s[l+i]>s[r-i]){ 22 flag=false; 23 break; 24 } 25 } 26 if(flag) 27 putchar(s[l++]); 28 else 29 putchar(s[r--]); 30 tag++; 31 if(tag==80){ 32 printf("\n"); 33 tag=0; 34 } 35 } 36 printf("\n"); 37 } 38 return 0; 39 }
浙公网安备 33010602011771号