zoukankan      html  css  js  c++  java
  • NJU 模拟试题 2

    从扑克牌中抽出5张无序纸牌,判断纸牌是否为顺子。1代表A,11代表J,12代表Q,13代表K,0代表大小王并可以视为任意纸牌。是则输出YES,否则输出NO。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    bool judge(int *a,int n)
    {
        n++;
        while (n < 5)
        {
            if (a[n - 1] == a[n]) return false;
            n++;
        }
        return true;
    }
    int main()
    {
        int a[5], joker = 0;
        for (int i = 0; i < 5; i++)
            cin >> a[i];
        sort(a, a + 5);
        for (int i = 0; i < 5; i++)
        {
            if (a[i] == 0) joker++;
            else
            {
                if (judge(a, i) && (a[4] - a[i]) - (4 - i) <= joker)
                    cout << "YES";
                else cout << "NO";
                break;
            }
        }
        return 0;
    }

    思路:首先判断是否存在重复卡牌,有则不会是顺子

    然后看 卡牌区间宽度 是否和 牌数量的宽度 相符合。joker的存在可以容许牌数量宽度的扩展。

    这个方法不用考虑是否处于边界,因为可以向另一个方向补位

    具体分析:

    0 0 1 4 5

    卡牌区间宽度为5-1=4,牌数量宽度为4-2=2。此时的两个joker可以使牌数量宽度与卡牌区间宽度匹配。

    0 1 3 4 5

    卡牌区间宽度为5-1=4,牌数量宽度为4-1=3。刚好又有一个joker。

    1 2 3 4 5

    卡牌区间宽度为5-1=4,牌数量宽度为4-0=4。此时就是顺子了。

    0 0 1 2 3

    卡牌区间宽度为3-1=2,牌数量宽度为4-2=2。这也是顺子,joker向4 5的方向补位。

    0 0 1 5 6

    卡牌区间宽度为6-1=5,牌数量宽度为4-2=2。需要三个joker来补,但是只有两个,所以不是顺子。

  • 相关阅读:
    hdu 1028 Ignatius and the Princess III (n的划分)
    CodeForces
    poj 3254 Corn Fields (状压DP入门)
    HYSBZ 1040 骑士 (基环外向树DP)
    PAT 1071 Speech Patterns (25)
    PAT 1077 Kuchiguse (20)
    PAT 1043 Is It a Binary Search Tree (25)
    PAT 1053 Path of Equal Weight (30)
    c++ 常用标准库
    常见数学问题
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/8274401.html
Copyright © 2011-2022 走看看