P10826 [EC Final 2020] Allin 题解
Cyx20110930 · · 题解
简要题意
每人
Sol
只有同花顺可能 allin。
证明:题目给定的牌为
若给定的五张牌次于四张一样(炸弹)的牌型,则存在
若给定的五张牌构成炸弹的牌型,此时由于四种花色都有,则一定有一张公共牌的花色不同于
当给定的五张牌为同花顺,此时可枚举对方牌型,看是否有赢的可能。对方赢的牌型必须满足以下条件:
-
是大于给定五张牌的同花顺
-
没有
h1,h2 -
至少包含
c1,c2,c3 其中一张
综上,证毕。
Code
#include <bits/stdc++.h>
using namespace std;
string h1,h2,c1,c2,c3;
vector<int> v;
int transfer(string x){
if(x[0]>='0' && x[0]<='9')
return x[0]-'0';
if(x[0]=='T')
return 10;
if(x[0]=='J')
return 11;
if(x[0]=='Q')
return 12;
if(x[0]=='K')
return 13;
if(x[0]=='A')
return 14;
}
int main(){
int T;
cin>>T;
while(T--){
v.clear();
string h1,h2,c1,c2,c3;
cin>>h1>>h2>>c1>>c2>>c3;
int flag=0,p=0;
if(h1[1]==h2[1] && h2[1]==c1[1] && c2[1] == c1[1] && c3[1] == c2[1]){
v.push_back(transfer(h1));
v.push_back(transfer(h2));
v.push_back(transfer(c1));
v.push_back(transfer(c2));
v.push_back(transfer(c3));
sort(v.begin(),v.end());
for(int i=1;i<v.size();i++){
if(v[i-1]+1==v[i]) continue;
else p=1;break;
}
if(!p){
if(max(transfer(h1),transfer(h2))>=10) flag=1;
if(max(transfer(h1),transfer(h2))>=max(max(transfer(c1),transfer(c2)),transfer(c3))) flag=1;
}
}
if(flag){cout<<"allin"<<endl;continue;}
v.clear();
if(transfer(h1)==14 && transfer(h2)==5){
if(h1[1]==h2[1] && h2[1]==c1[1] && c2[1]==c1[1] && c3[1]==c2[1]){
v.push_back(transfer(c1));
v.push_back(transfer(c2));
v.push_back(transfer(c3));
sort(v.begin(),v.end());
if(v[0]==2 && v[1]==3 && v[2]==4){cout<<"allin"<<endl;continue;}
}
}
if(transfer(h2)==14 && transfer(h1)==5){
if(h1[1]==h2[1] && h2[1]==c1[1] && c2[1]==c1[1] && c3[1]==c2[1]){
v.push_back(transfer(c1));
v.push_back(transfer(c2));
v.push_back(transfer(c3));
sort(v.begin(),v.end());
if(v[0]==2 && v[1]==3 && v[2]==4){cout<<"allin"<<endl;continue;}
}
}
cout<<"check"<<endl;
}
return 0;
}