top1编程
← 返回题目
题解

【基础】扑克牌组合

1 条题解

  • 0
    @ 2026-7-31 15:12:44

    解题思路

    从 n 张扑克牌里任取 2 张求和,要统计能组合出多少个不相等的和,并从小到大输出这些和。

    思路:用标记数组去重。

    1. 两两组合所有的牌,算它们的和
    2. 用一个数组 h 标记每个和是否出现过(和的范围是 2~26)
    3. 第一次出现的和计数加 1
    4. 从小到大扫描数组,输出所有标记过的和

    为什么要用数组标记? 不同组合可能得到相同的和(比如 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