描述 Description
FJ 打算带着他可爱的 N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛. 在比赛中, 每个农夫把他的奶牛排成一列, 然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母 (the initial letter of every cow), 举个例子, FJ 带了 Bessie, Sylvia, 和 Dora, 那么就可以缩写为 BSD. FJ 只需将奶牛的一个序列重新排列, 然后参加比赛. 他可以让序列中的第一头奶牛, 或者最后一头走出来, 站到新队列的队尾. 利欲熏心的 FJ 为了取得冠军, 他就必须使新队列的字典序尽量小. 给你初始奶牛序列(用头字母) 表示, 然后按照上述的规则组成新序列, 并使新序列的字典序尽量小.
输入格式 InputFormat
第 1 行: 一个整数 N.
第 2 行至第 N+1 行: 每行一个大写字母, 表示初始序列中该奶牛的头字母.
输出格式 OutputFormat
得到的最小字典序的序列. 每输出 80 个字母需要一个换行!
样例输入 SampleInput
51
A
A
B
B
A
B
B
B
B
A
B
A
B
B
A
B
A
B
A
A
B
B
A
A
B
B
B
A
A
A
A
B
A
A
B
A
B
A
A
B
B
A
A
A
B
B
B
B
B
B
A
样例输出 SampleOutput
AAABBABBBBABABBABABAABBAABBBAAAABAABABAABBAAABBBBBB
来源 Source
Silver
代码 Code
每次从两边取较小的,若相同,则往下一位比较,直到找到一个较小的,取较小的那边的。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
char a[2005];
int i,j,t,n,m,l,r,k,z,y,x;
inline char read()
{
char ch=getchar();
while (ch<'A' || ch>'Z') ch=getchar();
return ch;
}
inline bool comp(int l,int r)
{
if (l==r) return true;
while (a[l]==a[r] && l<r) l++,r--;
return a[l]<a[r];
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) a[i]=read();
l=1;r=n;
t=0;
while (l<=r)
{
if (comp(l,r))
{
printf("%c",a[l++]);
t++;
}
else
{
printf("%c",a[r--]);
t++;
}
if (t==80)
{
printf("n");
t=0;
}
}
return 0;
}