P6140 [USACO07NOV]Best Cow Line S
从俩边取字符组成字典序最小的序列,一想就是贪心,比较俩边取更小的字符就好了,不过得注意的是碰到相等的情况得继续向比,找到不相等的为止,通过双指针可以完成这个操作,当时我是特判了left>=right,后面看题解发现可以不用特判.解决问题会有想暴力完成的想法,而不是去尝试将这些点合并起来,以后写题过程多注意.`
#include<bits/stdc++.h>
using namespace std;
#define int long long
char c[20005];
vector<char> vc;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>c[i];
}
vc.push_back(-1);
int left=1,right=n,left2,right2;
while(left<right){
if(c[left]<c[right]){
vc.push_back(c[left]);
left++;
}
else if(c[left]>c[right]){
vc.push_back(c[right]);
right--;
}
else{
left2=left+1,right2=right-1;
while(c[left2]==c[right2]&&left2<right2){
left2++;
right2--;
}
// if(left2>right2){
// for(int i=left;i<left2;i++){
// vc.push_back(c[i]);
// }
// for(int i=left;i<left2;i++){
// vc.push_back(c[i]);
// }
// break;
// }
// else if(left2==right2){
// if(c[left2]>=c[left]){
// for(int i=left;i<left2;i++){
// vc.push_back(c[i]);
// }
// for(int i=left;i<=left2;i++){
// vc.push_back(c[i]);
// }
// }
// else{
// for(int i=left;i<=left2;i++){
// vc.push_back(c[i]);
// }
// for(int i=left;i<left2;i++){
// vc.push_back(c[i]);
// }
// }
// }
// else{
if(c[right2]<c[left2]){
vc.push_back(c[right]);
right--;
}
else{
vc.push_back(c[left]);
left++;
}
// }
}
}
if(left==right)vc.push_back(c[left]);
int i=80;
for(;i<vc.size();i+=80){
for(int j=i-79;j<=i;j++){
cout<<vc[j];
}
cout<<endl;
}
i-=79;
for(;i<vc.size();i++){
cout<<vc[i];
}
return 0;
}