題目大意:輸入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; }