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来补,但是只有两个,所以不是顺子。

原文地址:https://www.cnblogs.com/KakagouLT/p/8274401.html