c++小妖怪排好队

描述

牛魔王即将带着他的N(1≤ N ≤ 2,000)个小妖怪参加一年一度的“年度大王”比赛。在这场比赛中,每个大王都把他的手下排成一排,然后把它们放到评委身边。今年的比赛组织者采用了一种新的注册方案:只需按照每名手下出现的顺序注册它们的首字母(即,如果牛魔王按照这个顺序注册贝壳精,狮子精和袋鼠精,他只需注册BSD)。注册阶段结束后,根据名字首字母的字符串,按词典顺序对每个小组进行评判。牛魔王今年很忙,必须赶回山头,所以他希望尽早被评判。他决定在登记之前重新安排已经排好队的手下。牛魔王标志着一个新的竞争妖怪系列的位置。然后,他继续将小妖怪从旧排队线编组到新排队线,方法是反复将原始线中的第一头或最后一头小妖怪送到新线的末尾。当他完成后,牛魔王带着他的小妖怪们按照这个新顺序进行登记。给定他的妖怪们的初始顺序,确定他可以通过这种方式制作的最少的词典首字母串。

输入描述

第 1 行:单个整数:N ,后 N+1 行:第 i+1 行包含单个首字母: 'A'..'Z', (表示小妖怪在原始行中第 i 个位置的)

输出描述

牛魔王能做的最少的词典字符串。每一行(可能最后一行除外)都包含80个小妖怪的首字母('A'...'Z') 在新行中。


注意事项

  1. 这是一道贪心
  2. 输出80个字符要换行
  3. 跟牛魔王没有一毛钱关系

做题思路

  1. 贪心:开头小,选开头;结尾小,选结尾
  2. 如果一样大,就一直向里面比较

代码来啦

#include<iostream>
using namespace std;
char a[2005];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int l=1,r=n;
    int cnt=0;
	while(l<=r){
		if(a[l]<a[r]){
			cout<<a[l];
			l++;
		} else {
			if(a[l]>a[r]){
				cout<<a[r];
				r--;
			} else {
				int ll=l,rr=r;
				while(ll<=rr && a[ll]==a[rr]){
					ll++;
					rr--;
				}
				if(a[ll]<=a[rr]){
					cout<<a[l];
					l++;
				} else {
					cout<<a[r];
					r--;
				}
			}
		}

        cnt++;
        if(cnt%80==0){
            cout<<endl;
        }
	}
	return 0;
}

posted on 2024-04-06 07:18  可爱楷玩算法  阅读(11)  评论(0)    收藏  举报

导航