1 条题解

  • 0
    @ 2026-6-19 10:30:26

    📝 题目大意

    给定 NN 名参赛者和字符串 SSo 表示想参加决赛,x 表示不想),在所有想参加决赛的选手中,按排名顺序只允许前 KK 人参加。输出最终字符串 TTo 表示能参加,x 表示不能。

    💡 解题思路

    1. 题目分析N100N \leq 100,数据量极小,直接模拟即可。题目保证 SS 中至少有 KKo,无需处理名额不足的情况。
    2. 算法推导
      • 从头遍历原字符串 SS,维护剩余名额 kk
      • 若当前字符为 ok>0k > 0(还有名额),则该选手可以参赛,输出 o 并将 kk11
      • 否则输出 x(原本不想参赛的,或想参赛但名额已用完的)。
      • 由于是按排名顺序(即字符串从左到右)处理,自然满足"前 KK 个想参赛者"的条件。
    3. 边界与细节
      • kk 减到 00 后,后续所有字符(包括 o)均输出 x
      • 输入中 NNKK 在同一行,SS 在下一行,注意使用 cin 直接连续读取即可。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N) —— 遍历字符串一次。
    • 空间复杂度O(1)O(1) —— 仅使用几个变量,无需额外数组。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    #define rep(i, n) for (int i = 0; i < (int)(n); i++)
    int main() {
      int n, k;
      string s;
      cin >> n >> k >> s;            // 读入 N, K 和字符串 S
      for (int i = 0; i < (int)(n); i++) {
        if (k != 0 && s.at(i) == 'o') {  // 当前选手想参赛且还有名额
          cout << "o";                    // 可以参加决赛
          k--;                            // 名额减一
        } else {
          cout << "x";                    // 不能参赛(不想参赛 或 名额已满)
        }
      }
      cout << endl;
    }
    
    • 1

    信息

    ID
    696
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者