算法题--最佳的顺序【中等】

题目描述

小明打算带领 N 头马参加一年一度的谁是超级马大赛。在这场比赛中,每个参赛者必须让他的马排成一列,然后带领这些马从裁判面前依此走过。 比赛的登记规则为:取每头马名字的首字母,按照它们在队伍中的次序排成一列。将所有队伍的名字按字典序升序排序,从而得到出场顺序。 小明由于很着急,他希望能够尽早出场。因此他决定重排队列。 他的调整方式是这样的:每次,他从原队列的首端或尾端牵出一头马,将这两匹马安排到新队列尾部。重复这一操作直到所有马都插入新队列为止。 现在请你帮小明算出按照上面这种方法能排出的字典序最小的队列。

输入输出格式

输入格式 第一行一个整数 N 表示马的数量。 接下来 N 行每行一个大写字母,表示初始队列。 输出格式 输出一个长度为 N 的字符串,表示可能的最小字典序队列。

输入输出样例1

输入

 
  1. 6
  2. A
  3. C
  4. D
  5. B
  6. C
  7. B

输出

 
  1. ABCBCD
输入输出样例2

输入

 
  1. 5
  2. C
  3. G
  4. H
  5. A
  6. Z

输出

 
  1. 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;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值