ACM学习历程—Hihocoder 1177 顺子(模拟 && 排序 && gcd)(hihoCoder挑战赛12)

 

时间限制:6000ms

单点时限:1000ms

内存限制:256MB

 

描述

你在赌场里玩梭哈,已经被发了4张牌,现在你想要知道发下一张牌后你得到顺子的概率是多少?

假定赌场使用的是一副牌,四种花色的A、2、3、...、J、Q、K共52张,这副牌只发给你了4张,你的剩下一张牌从剩下48张中任意取出一张。

顺子指的是点数连续的五张牌,包括10、J、Q、K、A这种牌型(不包含同花顺,即构成顺子的五张牌花色不能相同)。参见:https://zh.wikipedia.org/wiki/%E6%92%B2%E5%85%8B%E7%89%8C%E5%9E%8B#.E7.89.8C.E5.9E.8B

输入

一行四个被空格隔开的长度为2或3的字符串,XY,表示你手里的牌。

X为2~10、J、Q、K、A中一个,表示点数,Y为S、H、C、D分别表示黑桃、红心、梅花和方块。

输出

一行一个分数表示概率,注意你的分数需为最简分数,若答案为0输出0/1。

样例输入

10S JS QS KD

样例输出

1/6

 

题目是个模拟,只用暴力枚举每一张牌即可。

最后答案gcd处理公约数以后输出。

 

代码:

 

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <cstring>

#include <algorithm>

#include <set>

#include <map>

#include <queue>

#include <string>

#define LL long long



using namespace std;



struct Card

{

    int num;

    char kind;

};



bool cmp(Card a, Card b)

{

    return a.num < b.num;

}



struct node

{

    Card card[5];

}my;



int ans;



//GCD

//求最大公约数

//O(logn)

int gcd(int a, int b)

{

    if (b == 0)

        return a;

    else

        return gcd(b, a%b);

}



bool input()

{

    char str[5];

    for (int i = 0; i < 4; ++i)

    {

        if (scanf("%s", str) == EOF)

            return false;

        if (strlen(str) == 2)

        {

            if ('2' <= str[0] && str[0] <= '9')

                my.card[i].num = str[0] - '0';

            else if (str[0] == 'A')

                my.card[i].num = 1;

            else if (str[0] == 'J')

                my.card[i].num = 11;

            else if (str[0] == 'Q')

                my.card[i].num = 12;

            else if (str[0] == 'K')

                my.card[i].num = 13;

            my.card[i].kind = str[1];

        }

        else

        {

            my.card[i].num = 10;

            my.card[i].kind = str[2];

        }

    }

    return true;

}



bool judge(node t)

{

    if (t.card[0].kind == t.card[1].kind &&

        t.card[1].kind == t.card[2].kind &&

        t.card[2].kind == t.card[3].kind &&

        t.card[3].kind == t.card[4].kind)

        return false;

    sort(t.card, t.card+5, cmp);

    if (t.card[0].num+1 == t.card[1].num &&

        t.card[1].num+1 == t.card[2].num &&

        t.card[2].num+1 == t.card[3].num &&

        t.card[3].num+1 == t.card[4].num)

        return true;

    if (t.card[0].num == 1 &&

        t.card[1].num+1 == t.card[2].num &&

        t.card[2].num+1 == t.card[3].num &&

        t.card[3].num+1 == t.card[4].num &&

        t.card[4].num == 13)

        return true;

    return false;

}



void work()

{

    ans = 0;

    for (int i = 1; i <= 13; ++i)

    {

        my.card[4].num = i;

        my.card[4].kind = 'S';

        ans += judge(my);

        my.card[4].kind = 'H';

        ans += judge(my);

        my.card[4].kind = 'C';

        ans += judge(my);

        my.card[4].kind = 'D';

        ans += judge(my);

    }

    int d = gcd(ans, 48);

    if (ans == 0)

        printf("0/1\n");

    else

        printf("%d/%d\n", ans/d, 48/d);

}



int main()

{

    //freopen("test.in", "r", stdin);

    while (input())

    {

        work();

    }

    return 0;

}

 

你可能感兴趣的:(code)