zoukankan      html  css  js  c++  java
  • hihocoder #1177 : 顺子 模拟

    #1177 : 顺子

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://hihocoder.com/problemset/problem/1177

    Description

    你在赌场里玩梭哈,已经被发了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

    Input

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

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

    Output

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

    Sample Input

    10S JS QS KD

    Sample Output

    1/6

    HINT

    题意

    题解:

    直接模拟就好了,注意花色必须不全部相同

    代码:

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define test freopen("test.txt","r",stdin)
    #define maxn 100001
    #define mod 10007
    #define eps 1e-9
    const int inf=0x3f3f3f3f;
    const ll infll = 0x3f3f3f3f3f3f3f3fLL;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    //**************************************************************************************
    
    //A、2、3、...、J、Q、K
    int gcd(int a,int b)
    {
        if(b==0)  return a;
        return gcd(b,a%b);
    }
    int lcm(int a,int b)
    {
        int c=gcd(a,b);
        return a*b/c;
    }
    struct node
    {
        int x,y;
    };
    bool cmp(node a,node b)
    {
        return a.x<b.x;
    };
    string s[4];
    vector<node> q;
    vector<node> a;
    int num[55][5];
    int main()
    {
        for(int i=0;i<4;i++)
            cin>>s[i];
        for(int i=0;i<4;i++)
        {
            int mmm=0;
            if(s[i][s[i].size()-1]=='S')
                mmm=1;
            else if(s[i][s[i].size()-1]=='H')
                mmm=2;
            else if(s[i][s[i].size()-1]=='C')
                mmm=3;
            else if(s[i][s[i].size()-1]=='D')
                mmm=4;
            if(s[i][0]=='A')
            {
                q.push_back((node){14,mmm});
                num[14][mmm]++;
            }
            else if(s[i][0]=='J')
            {
                q.push_back((node){11,mmm});
                num[11][mmm]++;
            }
            else if(s[i][0]=='Q')
            {
                q.push_back((node){12,mmm});
                num[12][mmm]++;
            }
            else if(s[i][0]=='K')
            {
                q.push_back((node){13,mmm});
                num[13][mmm]++;
            }
            else if(s[i][0]=='1'&&s[i][1]=='0')
            {
                q.push_back((node){10,mmm});
                num[10][mmm]++;
            }
            else
            {
                q.push_back((node){s[i][0]-'0',mmm});
                num[s[i][0]-'0'][mmm]++;
            }
        }
        int ans=0;
        for(int i=2;i<=14;i++)
        {
            int tt=1;
            while(tt<=4)
            {
                if(num[i][tt])
                    tt++;
                a.clear();
                for(int j=0;j<4;j++)
                    a.push_back(q[j]);
                a.push_back((node){i,tt});
                sort(a.begin(),a.end(),cmp);
                int flag=0;
                for(int j=0;j<4;j++)
                {
                    if(a[j].x!=a[j+1].x-1)
                        break;
                    if(j==3)
                        flag++;
                }
                if(flag==1)
                {
                    for(int j=0;j<5;j++)
                    {
                        for(int kiss=j+1;kiss<5;kiss++)
                        {
                            if(a[j].y!=a[kiss].y)
                            {
                                flag=2;
                                ans++;
                            }
                            if(flag==2)
                                break;
                        }
                        if(flag==2)
                            break;
                    }
                }
                tt++;
            }
        }
        int kk=ans,mm=48;
        int t=gcd(kk,mm);
        kk/=t;
        mm/=t;
        printf("%d/%d",kk,mm);
    }
  • 相关阅读:
    冲印数码照片的奥秘
    买手机(一)
    情人节的考验
    一日三茶
    追寻童年的乐趣在PSP上玩童年玩过的街机游戏
    转贴:常用的美国俚语
    用左手画CAD
    桃花朵朵开春游南汇桃花节
    不用GPRS照样用手机上网以后手机费不能报销的朋友们也能用手机上网啦!
    双休日去爬山
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4576924.html
Copyright © 2011-2022 走看看