B3660 [语言月赛202209] 集卡 题解

· · 题解

Source & Knowledge

2022 年 9 月语言月赛,由洛谷网校入门计划/基础计划提供。

考察对循环结构、多测的掌握与运用。

文字题解

本题考察对多测输入方面的理解与掌握。

本题的大致思路:首先读入一个测试组数 T。循环 T 次,每次读入一个 n 后循环 n 次,读入 n 个数字。如果这 n 个数字中有 0,则输出 yes,否则输出 no 即可。

补充:对于多测 T 组数据,一般使用这种框架进行编程。

int T;
cin >> T;
while (T--) {
    // 想要执行的语句
}

一种常见的错误代码为:

while (T--) {
    cin >> n;
    bool ok = false;
    for (int i = 1, x; i <= n; ++i) {
        cin >> x;
        if (x == 0) {
            puts("yes");
            ok = true;
            break;
        }
    }
    if (ok == false) {
        puts("no");
    }
}

在这种情况下,例如读入以下数据

2
3
1 0 1
6
1 0 0 0 0 0

考虑读入第一组数据。当读到第二个数字 0 时,如果输出 yes 后直接进行 break,当读入下一组数据的 n 时,会读入 “第一组数据的第三个数字 1”。这时则会产生错误。

所以此处无论结果如何,都应当将一组数据完整地读完,而不是在中间直接 break

while (T--) {
    cin >> n;
    bool ok = false;
    for (int i = 1, x; i <= n; ++i) {
        cin >> x;
        if (x == 0)
            ok = true;
    }
    if (ok == true)
        puts("yes");
    else
        puts("no");
}

视频题解