top1编程
← 返回题目
题解

斗地主

1 条题解

  • 0
    @ 2026-8-5 1:11:26

    解题思路

    顺子就是连续的牌,比如 1 2 3 4 5、6 7 8 9 10,相邻两张牌正好相差 1。

    题目保证输入的牌已经从小到大排好,所以我们只要从第 2 张开始,依次检查每一张是不是比前一张正好大 1:

    • 只要有一处不满足(差距不是 1),就不是顺子,输出 no;
    • 全部满足,就输出 yes。

    比如 2 3 6 8:3-2=1 没问题,但 6-3=3 不等于 1,所以不是顺子。

    参考代码

    // P4480 斗地主:判断输入的n张牌是否构成顺子
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;            // 纸牌数量
        cin >> n;
        int a[15];        // 存储n张牌(最多13张)
        for (int i = 0; i < n; i++) cin >> a[i];   // 输入已经从小到大排好
    
        bool ok = true;   // 是否构成顺子
        // 顺子要求相邻两张牌正好相差1
        for (int i = 1; i < n; i++) {
            if (a[i] != a[i - 1] + 1) {
                ok = false;   // 发现不连续,不是顺子
                break;
            }
        }
        if (ok) cout << "yes" << endl;
        else cout << "no" << endl;
        return 0;
    }
    

    复杂度分析

    需要把 n 张牌从前到后检查一遍,所以时间复杂度是 O(n);用一个数组存牌,额外空间 O(n)。

    • 1