题目链接:http://poj.org/problem?id=3617
题目大意:
FJ要参加“年度农场主”这个比赛,每个农场主要把他们的牛排成一条直线,将每头牛名称的首字母合成作为注册名,例如,FJ带了Bessie, Sylvia, 和Dora三头牛,则注册名就叫做BSD。注册名字典序靠前的可以提前参加比赛,FJ今年很忙,所以想要把它的牛重新排列,每次只能选择原直线的队首或队尾的牛到新直线的队尾。给定牛的一个初始顺序,给出牛重新排列后的最小字典序排序。
输入:
行1:一个整数N
行2-(N+1):一个字母('A'-'Z')
输出:
他能排列的最小字典序,每行输出80只牛则开启新的一行。
分析:
这是一个贪心题。每次比较队首和队尾的元素大小,小的则输出,大的则留下继续比较,相等则继续比较下一元素,直至找到小的一方,如果一直比较下去也找不到小的一方,则随意输出一方的元素。
源码:
#include <cstdio>
char a[2005];
int main() {
int N;
int i;
char temp[2];
scanf("%d", &N);
for(i = 0; i < N; ++i)
{
scanf("%s", temp);
a[i] = temp[0];
}
int m = 0, n = N-1;
int c = 0;
while(m <= n)
{
bool flag = 0;
// 开始与结尾相同,则继续比较
for(i = 0; i <= n - m; ++i)
{
if(a[m+i] < a[n-i])
{
flag = 1;
break;
}
else if(a[m+i] > a[n-i])
{
flag = 0;
break;
}
}
if(flag)
{
printf("%c", a[m++]);
}
else
{
printf("%c", a[n--]);
}
c++;
if(c % 80 == 0)
printf("\n");
}
printf("\n");
return 0;
}