时间限制:6000ms
单点时限:1000ms
内存限制:256MB
-
10S JS QS KD
样例输出 -
1/6
描述
你在赌场里玩梭哈,已经被发了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。
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
vector<int> ans;
vector<char> sans;
bool noequal = false;
bool judge(vector<int> ans) {
sort(ans.begin(), ans.end());
bool temp = true;
for(int i = 0; i < 4; ++i) {
if(ans[i]+1 != ans[i+1]) {
temp = false;
break;
}
}
if(temp == false) {
if(ans[0] == 1 && ans[1] == 10 && ans[2] == 11 && ans[3] == 12 && ans[4] == 13) {
temp = true;
}
}
return temp;
}
int main(int argc, const char * argv[]) {
string s;
char ss;
int num;
for(int i = 0; i < 4; ++i) {
cin>>s;
if(s[0] > '0' && s[0] <= '9') {
if(s[1] == '0') {
num = 10;
ss = s[2];
}else {
num = s[0] - '0';
ss = s[1];
}
}else if(s[0] == 'A') {
num = 1;
ss = s[1];
}else if(s[0] == 'J') {
num = 11;
ss = s[1];
}else if(s[0] == 'Q') {
num = 12;
ss = s[1];
}else if(s[0] == 'K') {
num = 13;
ss = s[1];
}
ans.push_back(num);
sans.push_back(ss);
}
for(int i = 0; i < 3; ++i) {
if(sans[i] != sans[i+1]) {
noequal = true;
}
}
int cases = 0;
for(int i = 1; i <= 13; ++i) {
ans.push_back(i);
if(judge(ans) == true) {
cases++;
}
ans.pop_back();
}
if(cases == 0) {
cout<<"0/1"<<endl;
return 0;
}
if(noequal == false) {
if(cases == 2) cout<<"1/8"<<endl;
else cout<<"1/16"<<endl;
}else {
if(cases == 2) cout<<"1/6"<<endl;
else cout<<"1/12"<<endl;
}
return 0;
}
最后有点偷懒,直接逼结果出来,应该用辗转相除法求最大公约数。