[蓝桥杯 2024 国 B] 最小字符串

[蓝桥杯 2024 国 B] 最小字符串

题目描述

给定一个长度为 N N N 且只包含小写字母的字符串 S S S,和 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,,cM。现在你要把 M M M 个小写字母全部插入到字符串 S S S 中,每个小写字母都可以插入到任意位置。

请问能得到的字典序最小的字符串是什么?

输入格式

第一行包含两个整数 N N N M M M

第二行包含一个长度为 N N N 的字符串 S S S
第三行包含 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,,cM

输出格式

输出一个长度为 N + M N + M N+M 的字符串代表答案。

输入输出样例 #1

输入 #1

4 3
abbc
cba

输出 #1

aabbbcc

输入输出样例 #2

输入 #2

7 3
lanqiao
bei

输出 #2

beilanqiao

说明/提示

【评测用例规模与约定】

对于 20 % 20\% 20% 的评测用例, M = 1 M = 1 M=1
对于 100 % 100\% 100% 的评测用例, 1 ≤ N , M ≤ 1 0 5 1 \le N, M \le 10^5 1N,M105

分析

这个题采用贪心的思想,先给c数组升序排序,然后遍历S和c,分别用两个指针指示S和c当前各自的位置,当S[i]小于c[j]时,输出S[i],否则输出c[j]同时移动相应的指针即可

代码

#include
using namespace std;
int N, M;
string S;
char c[100005];
int main() {
    cin >> N >> M;
    cin >> S;
    for (int i = 0; i < M; i++)
        cin >> c[i];
    sort(c, c + M);
    int i = 0, j = 0;
    while (1) {
        if (i < N && j < M) {
            if (S[i] <= c[j]) {
                cout << S[i++];
            }
            else {
                cout << c[j++];
            }
        }
        else if (i >= N && j < M) {
            cout << c[j++];
        }
        else if (i < N && j >= M) {
            cout << S[i++];
        }
        else
            break;
    }
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,职场和发展)