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);
}
原文地址:https://www.cnblogs.com/qscqesze/p/4576924.html