题目描述
小明打算带领 N
头马参加一年一度的谁是超级马大赛。在这场比赛中,每个参赛者必须让他的马排成一列,然后带领这些马从裁判面前依此走过。 比赛的登记规则为:取每头马名字的首字母,按照它们在队伍中的次序排成一列。将所有队伍的名字按字典序升序排序,从而得到出场顺序。 小明由于很着急,他希望能够尽早出场。因此他决定重排队列。 他的调整方式是这样的:每次,他从原队列的首端或尾端牵出一头马,将这两匹马安排到新队列尾部。重复这一操作直到所有马都插入新队列为止。 现在请你帮小明算出按照上面这种方法能排出的字典序最小的队列。
输入输出格式
输入格式 第一行一个整数 N
表示马的数量。 接下来 N
行每行一个大写字母,表示初始队列。 输出格式 输出一个长度为 N
的字符串,表示可能的最小字典序队列。
输入输出样例1
输入
6
A
C
D
B
C
B
输出
ABCBCD
输入输出样例2
输入
5
C
G
H
A
Z
输出
CGHAZ
说明提示
1≤N≤2000
如果超过 80
个字符则换行再输出
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N; // 输入马的数量
vector<char> horses(N);
for (int i = 0; i < N; i++) {
cin >> horses[i]; // 输入初始队列
}
string result = "";
int left = 0, right = N - 1;
//从两端开始比较,选择字典较小的马依次加入队列
while (left <= right) {
bool isLeft = false;
for (int i = 0; left + i <= right; i++) {
if (horses[left + i] < horses[right - i]) {
isLeft = true;
break;
} else if (horses[left + i] > horses[right - i]) {
isLeft = false;
break;
}
}
if (isLeft) {
result += horses[left++]; // 选择左端的马加入新队列
} else {
result += horses[right--]; // 选择右端的马加入新队列
}
}
cout << result << endl;
return 0;
}