#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); }