• 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
    ");
        else
            printf("%d/%d
    ", ans/d, 48/d);
    }
    
    int main()
    {
        //freopen("test.in", "r", stdin);
        while (input())
        {
            work();
        }
        return 0;
    }
  • 相关阅读:
    使用socket BPF/Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
    使用Iperf工具测试android系统网络wifi的吞吐量wifithrougput
    html input中 button和submit的区别
    Linux转发性能评估与优化(转发瓶颈分析与解决方案)
    交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
    MySQL查询不区分大小写的sql写法
    Docker镜像保存save、加载load
    将Spring-boot应用部署到Docker容器
    Docker 安装使用
    Scalatra文件下载时中文乱码
  • 原文地址:https://www.cnblogs.com/andyqsmart/p/4575774.html
Copyright © 2020-2023  润新知