题解:P10826 [EC Final 2020] Allin
思路
先研究题目,不要急着直接模拟。依题意得,题目给出了 Wolf Chicken 的牌组,其中前
易推得当 Wolf Chicken 牌组种类的值
而现在就剩下了 Wolf Chicken 的牌组为同花顺的情况,因为如果 Wolf Chicken 有皇家同花顺必赢。
- 当
3 张公开牌中有1 张是同花顺中等级最高的,且这张牌的值\le 9 ,则不能一定赢。当然如果公开牌中有 A 则也不能赢。对手会组成皇家同花顺。 - 当底牌中包含 T,J,Q,K 的其中一个时一定能赢,因为 9,T,J,Q,K 已经是最大的同花顺,所以就算公开牌中有等级最高的牌也不能再次组成同花顺了。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
int t;
int main()
{
cin>>t;
while(t--)
{
string s1[6];
int q[101];
memset(q,0,sizeof(q));
bool flag=0;
int sum=0;
for(int i=1;i<=5;i++)
{
cin>>s1[i];
if(s1[i][0]>='0'&&s1[i][0]<='9') q[s1[i][0]-'0']=1;
else if(s1[i][0]=='A') q[1]=1;
else if(s1[i][0]=='J') q[11]=1;
else if(s1[i][0]=='Q') q[12]=1;
else if(s1[i][0]=='K') q[13]=1;
else if(s1[i][0]=='T') q[10]=1;//将字母映射成数字方便判断同花顺
if(i!=1&&s1[i-1][1]!=s1[i][1]&&!flag)//判断同花
{
flag=1;
cout<<"check\n";
}
if(s1[i][0]=='A'||s1[i][0]=='K'||s1[i][0]=='Q'||s1[i][0]=='J'||s1[i][0]=='T') sum++;
}
if(flag) continue;
if(sum==5)
{
cout<<"allin\n";//皇家同花顺
continue;
}
for(int i=1;i<=13;i++)
{
for(int j=i;j<=i+4;j++)//判断顺
{
if(q[j]!=1) break;
if(j==i+4&&q[j]==1&&s1[5][0]>='0'&&s1[5][0]<='9'&&j!=s1[5][0]-'0'&&s1[5][0]>s1[4][0]&&s1[5][0]>s1[3][0]) flag=1;
else if(j==i+4&&q[j]==1&&s1[4][0]>='0'&&s1[4][0]<='9'&&j!=s1[4][0]-'0'&&s1[4][0]>s1[5][0]&&s1[4][0]>s1[3][0]) flag=1;
else if(j==i+4&&q[j]==1&&s1[3][0]>='0'&&s1[3][0]<='9'&&j!=s1[3][0]-'0'&&s1[3][0]>s1[5][0]&&s1[3][0]>s1[4][0]) flag=1;
//判断的第一种情况(不过我这里把不能一定赢的情况转换成能赢的情况了)
//这里成功把公开牌中有A的情况避开了qwq,因为只判断了数字的情况
else if(j==i+4&&q[j]==1&&(s1[1][0]=='T'||s1[1][0]=='J'||s1[1][0]=='Q'||s1[1][0]=='K')) flag=1;
else if(j==i+4&&q[j]==1&&(s1[2][0]=='T'||s1[2][0]=='J'||s1[2][0]=='Q'||s1[2][0]=='K')) flag=1;
//判断的第二种情况
}
if(flag)
{
cout<<"allin\n";
break;
}
}
if(!flag) cout<<"check\n";
}
}