/*字典序最小问题:
给定长度为N的字符串S,要构造一个长度为N的字符串T。起初T是一个空串,随后反复进行下列任意操作:
1.从S的头部删除一个字符,加到T的尾部。
2.从S的尾部删除一个字符,加到T的尾部。
目标是要构造字典序尽可能小的字符串T。
1<=N<=2000
字符串S只包含大写英文字母。
算法:
不断的比较S的开头和结尾中较小的一个字符放到T的尾部。
但是存在一个特殊的情况,就是当首尾相等时,应先选择最先到达小的情况,采用的是原始与翻转后进行字符串的字典序比较,,将小的先加到
尾部。
本代码在判断翻转后的字典序的比较方法上应用巧妙。值得深思。。
*/
# include <iostream>
# include <stdio.h>
using namespace std;
# define MAX_N 2000
int N;
char S[MAX_N+1];
void solve()
{
int a=0,b=N-1;
while(a<=b)
{
bool left=false;
for(int i=0;i+a<=b;i++) //非常巧妙
{
if(S[a+i]<S[b-i])
{
left=true;
break;
}
else if(S[a+i]>S[b-i])
{
left=false;
break;
}
}
if(left)
putchar(S[a++]);
else
putchar(S[b--]);
}
putchar(10);
}
int main()
{
while(cin>>N)
{
for(int i=0;i<N;i++)
cin>>S[i];
solve();
}
return 0;
}
字典序最小问题 前后删除加入 贪心poj3617
最新推荐文章于 2022-11-24 18:40:00 发布
