您的位置:首页 > 其它

字典序最小问题(贪心)

2018-02-27 15:15 357 查看
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2000;
/*
给定长度为N的字符窜S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复
进行下列任何操作。
1.从S的头部删除一个字符串,加到T的尾部
2.从S的尾部删除一个字符串,加到T的尾部
目标是要构造字典序尽可能小的字符串T。
限制条件:
1 ≤N ≤2000
字符串S只包含大写英文字母
输入:
N = 6
S = "ACDBCB"
输出:
ABCBCD(如下图所示进行操作)

S="ACDBCB"  ==>(开头)  S="CDBCB" ==>(末尾)  S="CDBC"  ==>(末尾)  S="CDB"
T=""				   T="A"				T="AB"				 T="ABC"

==>(末尾) S="CD"	==>(开头)	S="D"		==>(开头)   S=""
T="ABCB"				T="ABCBC"				T="ABCBCD"

*/

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; a + i <= 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--]);
}
}

int main()
{
scanf("%d%*c", &n);
gets(S);
solve();
return 0;
}
=============================我是一个反应迟钝的程序员====================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: