题解
【基础】扑克牌组合
1 条题解
-
0
解题思路
从 n 张扑克牌里任取 2 张求和,要统计能组合出多少个不相等的和,并从小到大输出这些和。
思路:用标记数组去重。
- 两两组合所有的牌,算它们的和
- 用一个数组 h 标记每个和是否出现过(和的范围是 2~26)
- 第一次出现的和计数加 1
- 从小到大扫描数组,输出所有标记过的和
为什么要用数组标记? 不同组合可能得到相同的和(比如 1+4 和 2+3 都是 5),用数组标记就能自动去重,而且数组下标天然是从小到大,输出时直接按顺序扫就行。
举例:4 张牌 3 1 2 4
- 组合和:3+1=4、3+2=5、3+4=7、1+2=3、1+4=5、2+4=6
- 不同的和:3 4 5 6 7,共 5 个
参考代码
#include <iostream> using namespace std; int main() { int n, a[53]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; int h[27] = {0}; // 标记出现过的和 int s = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int sum = a[i] + a[j]; if (h[sum] == 0) { // 第一次出现 h[sum] = 1; s++; } } } cout << s << endl; bool first = true; for (int i = 2; i < 27; i++) { // 从小到大输出 if (h[i] == 1) { if (!first) cout << " "; first = false; cout << i; } } return 0; }复杂度分析
- 时间复杂度:O(N²),两两组合
- 空间复杂度:O(1),固定大小的标记数组
- 1