题目
分析
其实就是给你一个长度为 n 的字符串 s ,按照一次只能取 s 的首 or 尾的操作,获得一个新的字符串 t ,要求输出字符序列最小的那个 t 。
贪心算法,不断比较首尾(x,y),每次取最小的,
如果首小,就输出首部,继续比较首尾(x+1,y)
如果尾小,就输出尾部,继续比较首尾(x,y-1)
如果尾部与首部相同,就比较次首与次尾,如果相同就一直找(for循环),直到找到可以比较的(break)
如果循环完了都没找到,说明此字符(x~y)从首部到中部=从尾部到中部,例如aba,aaa,baab。此时选择首部尾部都可以,我代码选择输出尾部。
坑:
最开始提交上去没AC,不知道为啥没通过,说是输出格式有问题,但我结尾换不换行,都通不过。(Presentation Error…就很神奇)
解决:
每行只能输出80个字符,因此当超过的时候,需要进行判断,输出换行字符,就过了
AC代码
#include<iostream>
#define N 999999
using namespace std;
int n;
char a[N];
int num;//一行最多80个字符,超过需要换行
void sovle() {
int x=0,y=n-1;
while(x<=y) {//两个指针
int sign=0;
for(int i=x,j=y; i<j; j--,i++) {//比较目前x-y的字符串的首尾大小
if(a[i]<a[j]) {//比较出来了 ,首小
sign=1;
break;
}
if(a[i]>a[j]) {//比较出来了 ,尾小
sign=2;
break;
}
}
if(sign==1) {// //比较出来了 ,首小
cout<<a[x];
num++;
x++;
} else {
cout<<a[y];//比较出来了 ,尾小 或者没有比较出来,说明目前这个字符串首尾是相同的,那么直接从尾部开始输出,没差
num++;
y--;
}
if(num==80){
num=0;
cout<<endl;
}
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
sovle();
}
收获
1. 贪心算法
2. 每行只能输出80个字符,超过需要输出换行字符