题目描述
题解
首先贪心的思路是很好想的,因为队首和队尾字典序小的肯定要先放。
但是遇到队首和队尾相同的情况就要考虑一下,比较当前所剩的字符串的正序和反序的字典序。比如CBAC就要考虑比较CBAC和CABC,发现第二个字典序更小,显然从队尾取更优。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int max_n=2005;
char s[max_n];
int n,cnt,l,r;
inline int cmp(int l,int r){
for (int i=l;i<=r;++i)
if (s[i]<s[r-(i-l)]) return 1;
else if (s[i]>s[r-(i-l)]) return 0;
return 1;
}
int main(){
scanf("%d\n",&n);
for (int i=1;i<n;++i) scanf("%c\n",&s[i]); scanf("%c",&s[n]);
l=1,r=n,cnt=0;
while (l<=r){
if (s[l]<s[r]){
putchar(s[l++]);
if (!((++cnt)%80)) putchar('\n');
}
else if (s[l]>s[r]){
putchar(s[r--]);
if (!((++cnt)%80)) putchar('\n');
}
else{
if (cmp(l,r)==1) putchar(s[l++]);
else putchar(s[r--]);
if (!((++cnt)%80)) putchar('\n');
}
}
}
总结
像反序啊,回文串比较一类的一定要好好看清楚,循环很容易写错。