题意:给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作:
从S的头部删除一个字符,加到T的尾部
从S的尾部删除一个字符,加到T的尾部
目标是使T字典序最小,输出时每行最多80个字符。
从S的头部删除一个字符,加到T的尾部
从S的尾部删除一个字符,加到T的尾部
目标是使T字典序最小,输出时每行最多80个字符。
算法:贪心。每次选择S头部或尾部最小的字符,如果两者相同,继续比较下一个字符,直到找到较小的字符。
#include <iostream>
using namespace std;
int N;
char c[2010];
void solve()
{
int l = 0;
int r = N - 1;
bool left, right;
left = true;
int cnt = 0;
while (l <= r)
{
int i;
for (i=0; i+l<r; i++)
{
if (c[i+l] > c[r-i])
{
left = false;
break;
}
else if (c[i+l] < c[r-i])
{
left = true;
break;
}
}
left? cout << c[l++] : cout << c[r--];
cnt++;
if (cnt % 80 == 0)
{
cout << endl;
}
}
if (cnt % 80 != 0)
{
cout << endl;
}
}
int main()
{
cin >> N;
for (int i=0; i<N; i++)
{
cin >> c[i];
}
solve();
}