top1编程
← 返回题目
题解

集卡

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4429 集卡(入门)

    解题思路

    读入一串卡牌编号,最后一个0表示结束,只要其中出现编号5(隐藏款),就输出yes,否则输出no。注意不是数有几个5,而是看有没有,所以用一个"标记"变量found就够了:found一开始是0(还没抽到),循环里每读一张牌x,如果 x==5,就把found改成1。循环结束后检查found:是1就说明抽到过隐藏款,输出yes;还是0就说明一张都没抽到,输出no。边界情况:如果5在很靠前的位置(比如第一张),我们把found改成1后,后面的牌不管是什么都不用再改,循环结束时found还是1;如果读到0之前一张5都没有,found保持0,输出no;如果第一个数就是0(一张牌都没有),也输出no,符合"没抽到"的意思。注意输出是小写的yes/no,要和样例一致。

    参考代码

    // 程序用途:读入一串卡牌编号(以0结尾),只要出现5(隐藏款)就输出yes否则输出no
    #include <iostream>
    using namespace std;
    
    int main() {
        int x, found = 0;               // found标记是否抽到隐藏款5,0表示还没抽到
        while (cin >> x && x != 0) {    // 读到0结束
            if (x == 5) found = 1;      // 编号是5,说明抽到隐藏款
        }
        if (found) cout << "yes" << endl;   // 抽到过就输出yes
        else cout << "no" << endl;          // 一张都没抽到就输出no
        return 0;
    }
    

    复杂度分析

    把n张牌各读一遍、各判断一次,所以时间复杂度 O(n);只用x、found两个变量,额外空间复杂度 O(1)。

    • 1