字典序最小问题(贪心)
题目大意:输入n,代表有一个长度为n的字符串。 起初,T是一个空串,随后反复进行下列任意操作:
从S 的头部删除一个字符,加入到T的尾部‘
从S的尾部删除一个字符,加入到T的尾部
目的是构造字典序尽可能小的字符串T
限制条件: 1<=n<=2000,每个字符串只包含大写字母
思路:这题主要要知道当前后一样时该选哪个,因为要字典序最小,所以应该更快的 选到小的字母,所以当两个字母一样时还要比较更里面的字符····一直下去
看代码
#include<iostream> #include<string.h> #include<map> #include<cstdio> #include<cstring> #include<stdio.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=2e3+10; const int maxk=1e4+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 int n; char a[maxn]; void solve() { int l=0,r=n-1,sum=0;//都是从两端开始 while(l<=r) { bool flag=false; for(int i=0;l+i<n;i++) { if(a[l+i]<a[r-i]) { flag=true; break; } else if(a[l+i]>a[r-i]) { break; } } if(flag) cout<<a[l++];//l++,已经不从两端开始了 else cout<<a[r--]; sum++; if(sum==80) { cout<<endl; sum=0; } } cout<<endl; } int main() { cin>>n; for(int i=0;i<n;i++) // scanf(" %c",&a[i]); cin>>a[i]; solve(); return 0; }
当初的梦想实现了吗,事到如今只好放弃吗~