P10826 [EC Final 2020] Allin 题解

· · 题解

简要题意

每人 2 张牌,公共牌区 5 张牌,现在给你你的牌,与公共牌区的 3 张牌,问你是否保证胜利。(即 allin)

Sol

只有同花顺可能 allin。

证明:题目给定的牌为 h1,h2,c1,c2,c3,设对方的两张为 g1,g2,剩下两张未给出的公共牌为 c4,c5

若给定的五张牌次于四张一样(炸弹)的牌型,则存在 g1=g2=c4=c5 使得对方构成炸弹的牌型,故不可 allin。

若给定的五张牌构成炸弹的牌型,此时由于四种花色都有,则一定有一张公共牌的花色不同于 h1h2,不妨设这张牌为 c1,那么存在一种方案使得 c1,c4,c5,g1,g2 构成同花顺,故不可 allin。

当给定的五张牌为同花顺,此时可枚举对方牌型,看是否有赢的可能。对方赢的牌型必须满足以下条件:

综上,证毕。

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