[USACO2007NOVS] Best Cow Line S

题目描述

Farmer John 打算带领 \(N\)\(1 \leq N \leq 2\,000\))头奶牛参加一年一度的”全美农场主大奖赛“。在这场比赛中,每个参赛者必须让他的奶牛排成一列,然后带领这些奶牛从裁判面前依此走过。

今年,竞赛委员会在接受报名时,采用了一种新的登记规则:取每头奶牛名字的首字母,按照它们在队伍中的次序排成一列。将所有队伍的名字按字典序升序排序,从而得到出场顺序。

FJ 由于事务繁忙,他希望能够尽早出场。因此他决定重排队列。

他的调整方式是这样的:每次,他从原队列的首端或尾端牵出一头奶牛,将她安排到新队列尾部。重复这一操作直到所有奶牛都插入新队列为止。

现在请你帮 FJ 算出按照上面这种方法能排出的字典序最小的队列。

输入格式

第一行一个整数 \(N\)

接下来 \(N\) 行每行一个大写字母,表示初始队列。

输出格式

输出一个长度为 \(N\) 的字符串,表示可能的最小字典序队列。

每输出 \(80\) 个字母需要一个换行。

样例 #1

样例输入 #1

6
A
C
D
B
C
B

样例输出 #1

ABCBCD

考虑贪心,如果开头和结尾不一样,那肯定是取最小的作为下一位。如果一样呢?那就比较第二位,第二位小的那就可以更快去到小的数,以此类推。如果比较到最后都一样那就说明怎么去答案都一样。

#include<cstdio>
const int N=2005;
int n,l,r,kl,kr,cnt;
char c[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf(" %c",&c[i]);
	l=1,r=n;
	while(l<=r)
	{
		kl=l,kr=r;
		while(c[kl]==c[kr]&&kr>=kl)
			++kl,--kr;
		if(c[kl]==c[kr])
			putchar(c[l]),++l;
		else if(c[kl]>c[kr])
			putchar(c[r]),--r;
		else
			putchar(c[l]),++l;
		++cnt;
		if(cnt==80)
			putchar('\n'),cnt=0;
	}
}
posted @ 2022-05-24 22:37  灰鲭鲨  阅读(25)  评论(0编辑  收藏  举报