1 条题解

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

    📝 题目大意

    给定 55 张卡牌,每张牌上有一个 1131 \sim 13 的整数。判断是否存在一种数字出现恰好 33 次、另一种数字出现恰好 22 次(即扑克牌中的"葫芦"),输出 YesNo

    💡 解题思路

    1. 题目分析:只有 55 张牌,数字范围 [1,13][1,13] 很小。要构成 Full House,55 张牌中必然只有两种不同数字,且计数分别为 3322
    2. 算法推导
      • map<int, int> 统计每种数字的出现次数(d[a[i]]++)。
      • 遍历 map,检查是否存在计数为 33 的键(c = true)和计数为 22 的键(b = true)。
      • c && b 同时成立,则构成 Full House,否则不是。
      • 由于 55 张牌总计 55 次,出现 33 次和 22 次恰好用完 55 次,只需检查这两个条件即可,无需额外判断。
    3. 边界与细节
      • 输入保证 A,B,C,D,EA,B,C,D,E 不全相同,所以不会出现 55 张相同的情况(此时只有一种计数 55cb 均为 false,输出 No,符合预期)。
      • 注意 55 张牌出现 4+14+155 种不同数字等情况,cb 不可能同时为 true,自然输出 No

    ⏱️ 复杂度分析

    • 时间复杂度O(5log5)O(5 \log 5),即常数级别,因为只处理 55 个元素,map 插入和遍历均为常数。
    • 空间复杂度O(1)O(1),map 最多存储 55 种不同数字。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int a[5];
        // 读入 5 张牌
        for(int i = 0; i < 5; i++) cin >> a[i];
        map<int, int> d;
        // 统计每种数字的出现次数
        for(int i = 0; i < 5; i++) d[a[i]]++;
        bool c = false; // 是否存在出现 3 次的数字
        bool b = false; // 是否存在出现 2 次的数字
        for(auto& p : d){
            if(p.second == 3) c = true;
            if(p.second == 2) b = true;
        }
        // 同时满足 3 张相同 + 2 张相同即为 Full House
        if(c && b) cout << "Yes";
        else cout << "No";
        return 0;
    }
    
    • 1

    信息

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