T362598 Glaciaxion

Glaciaxion

题目描述

冰封的世界可以看作是 $ n $ 块初始时冷冻的冰川,这些冰川被编号为 1 ∼ n 1 \sim n 1n

探测器抵达后的 $ m $ 秒,每秒都会探测到一块冰川融化。

当一块冰川第一次融化时,探测器返回 N,否则返回 Y

你需要根据探测器按顺序返回的信息,给出字典序最小的冰川融化过程的编号序列。如果不存在这样的编号序列,请输出 No solution报告无解。

输入格式

第一行两个整数 $ n,m $。

接下来一行 $ m $ 个字符(NY,不加分隔),表示探测器按顺序返回的结果。

输出格式

一行一个长度为 $ m $ 的整数序列(空格分隔),表示字典序最小的冰川融化过程的编号序列,或输出 No solution报告无解。

样例 #1

样例输入 #1

3 4
NYNY

样例输出 #1

1 1 2 1

样例 #2

样例输入 #2

5 3
YYY

样例输出 #2

No solution

样例 #3

样例输入 #3

5 7
NNNNNYN

样例输出 #3

No solution

提示

【样例 1 解释】

第 1 秒,1 号冰川融化,这是其首次融化,返回 N

第 2 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1 秒融化过,返回 Y

第 3 秒,2 号冰川融化,这是其首次融化,返回 N

第 4 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1,2 秒融化过,返回 Y

【数据范围】

对于 $ 100% $ 的数据,$ 1 \le n,m \le 10^6 $。

提示:本题开启捆绑测试。

Subtask Sp.   Constraints Score 1 n , m ≤ 8 23 2 n , m ≤ 1000 25 3 探测器返回结果只有一种字符 15 4 保证有解 17 5 无特殊限制 20 \def\r{\cr\hline} \def\None{\text{None}} \def\arraystretch{1.5} \begin{array}{c|c|c} \textbf{Subtask} & \textbf{Sp. Constraints} & \textbf{Score}\r \textsf1& n,m\le 8 & 23 \r \textsf2& n,m\le 1000 & 25 \r \textsf3& 探测器返回结果只有一种字符 & 15 \r \textsf4& 保证有解 & 17 \r \textsf5& 无特殊限制 & 20 \r \end{array} Subtask12345Sp. Constraintsn,m8n,m1000探测器返回结果只有一种字符保证有解无特殊限制Score2325151720

解题思路

  1. 首先,根据题目要求,我们需要读入冰川数量 n 和探测次数 m。
  2. 接下来,我们需要读入一个字符串 s,表示探测结果。在这个字符串中,每个字符 ‘Y’ 表示冰川融化,‘N’ 表示冰川没有融化。
  3. 我们使用一个循环来处理每次探测的结果。在循环内部,我们检查以下几种情况:
  4. 如果第一个探测结果就是 ‘Y’,说明第一个冰川就融化了,因此无解,直接输出 “No solution”。
  5. 如果当前冰川没有融化(‘N’),我们将当前的冰川编号添加到 last 中,并递增计数器 count。
  6. 如果 count 超过了 n+1,说明编号超出了冰川数量,也无解,直接输出 “No solution”。
  7. 如果当前冰川融化了(‘Y’),我们添加 ‘1’ 表示第一个融化的冰川到 last 中。
  8. 循环结束后,我们输出最终的冰川融化顺序 last。
#include 
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;  // 输入冰川数量 n 和探测次数 m

    string last, s;
    cin >> s;  // 输入探测结果字符串

    int count = 1;  // 初始化计数器,表示冰川编号
    for (int i = 0; i < m; i++) {  // 遍历探测结果
        if (s[0] == 'Y') {  // 如果第一个探测结果就是 'Y',无解
            cout << "No solution";
            return 0;
        }
        else if (s[i] == 'N') {  // 如果冰川没有融化
            last += to_string(count);  // 将当前冰川编号添加到 last
            last += ' ';  // 加一个空格,以便后面的输出
            count++;  // 冰川编号加一
            if (count > n + 1) {  // 如果编号超出冰川数量,无解
                cout << "No solution";
                return 0;
            }
        }
        else if (s[i] == 'Y') {  // 如果冰川融化了
            last += '1';  // 添加 '1' 表示第一个融化的冰川
            last += ' ';  // 加一个空格,以便后面的输出
        }
    }
    
    // 输出最终的冰川融化顺序
    cout << last;
    return 0;
}

你可能感兴趣的:(洛谷入门,算法)