1 条题解
-
0
📝 题目大意
给定 张卡牌,每张牌上有一个 的整数。判断是否存在一种数字出现恰好 次、另一种数字出现恰好 次(即扑克牌中的"葫芦"),输出
Yes或No。💡 解题思路
- 题目分析:只有 张牌,数字范围 很小。要构成 Full House, 张牌中必然只有两种不同数字,且计数分别为 和 。
- 算法推导:
- 用
map<int, int>统计每种数字的出现次数(d[a[i]]++)。 - 遍历 map,检查是否存在计数为 的键(
c = true)和计数为 的键(b = true)。 - 若
c && b同时成立,则构成 Full House,否则不是。 - 由于 张牌总计 次,出现 次和 次恰好用完 次,只需检查这两个条件即可,无需额外判断。
- 用
- 边界与细节:
- 输入保证 不全相同,所以不会出现 张相同的情况(此时只有一种计数 ,
c和b均为false,输出No,符合预期)。 - 注意 张牌出现 或 种不同数字等情况,
c和b不可能同时为true,自然输出No。
- 输入保证 不全相同,所以不会出现 张相同的情况(此时只有一种计数 ,
⏱️ 复杂度分析
- 时间复杂度:,即常数级别,因为只处理 个元素,map 插入和遍历均为常数。
- 空间复杂度:,map 最多存储 种不同数字。
💻 标准代码 (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
- 上传者