题意: 给定长度为N的字符串S,要构造一个长度为N的字符串T。起初T是一个空串,随后反复进行下列任意操作
1.从字符串S头部删除一个字符,加到T的尾部
2.从字符串S尾部删除一个字符,加到T的尾部
目的是,构造字典序尽可能小的字符串T
思路:简单贪心,比较当前字符串S首尾字符的大小,选取小的加入T,若两者相同,则比较下一个字符。
#include<stdio.h> #include<queue> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #define INF 0x3f3f3f3f #define LL long long #define MOD 100000007 #define MAXSIZE 10005 using namespace std; char s[MAXSIZE],t[MAXSIZE]; int main() { int n,lt; char ch; while(scanf("%d ",&n)!=EOF) { lt=1; for(int i=1;i<=n;i++) scanf("%c%c",&s[i],&ch); int p1=1,p2=n; while(p1 <= p2) { if(s[p1] < s[p2]) { t[lt++] = s[p1]; p1++; } else if(s[p1] > s[p2]) { t[lt++] = s[p2]; p2--; } else { int t1 = p1; int t2 = p2; while(s[t1] == s[t2] && t1<t2) { t1++; t2--; } if(s[t1] <= s[t2]) { t[lt++] = s[p1]; p1++; } else { t[lt++] = s[p2]; p2--; } } } for(int i=1;i<=n;i++) { printf("%c",t[i]); if(i%80==0) printf(" "); } } return 0; }