2014 多校联合训练赛6 Fighting the Landlords

本场比赛的三个水题之一,题意是两个玩家每人都持有一手牌,问第一个玩家是否有一种出牌方法使得在第一回和对方无牌可出。直接模拟即可,注意一次出完的情况,一开始没主意,wa了一发。

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s[3][30];
int player[4][30];
int hashCard(char ch){
    if(ch >= '3' && ch <= '9') return ch-'0'-3;
    if(ch == 'T') return 7;
    if(ch == 'J') return 8;
    if(ch == 'Q') return 9;
    if(ch == 'K') return 10;
    if(ch == 'A') return 11;
    if(ch == '2') return 12;
    if(ch == 'X') return 13;
    if(ch == 'Y') return 14;
}
void init(int idx){
    int len = strlen(s[idx]);
    memset(player[idx],0,sizeof player[idx]);
    for(int i = 0;i < len;i ++) player[idx][hashCard(s[idx][i])] ++;
}
int cntNum(int idx,int num){
    int ret = 0;
    for(int i = 0;i < 20 ;i ++)
        if(player[idx][i] == num) ret++;
    return ret;
}
bool isHaveCnt(int idx,int cnt){
    for(int i = 0;i < 20;i ++)
        if(player[idx][i] == cnt) return true;
    return false;
}
bool checkOneToFour(int cnt){
    bool ret = false;
    for(int i = 20;i >= 0;i --){
        int flag = 0;
        if(player[1][i] < cnt) continue;
        for(int j = 20;j >= 0;j --){
            if(player[2][j] < cnt) continue;
            if(j > i){
                flag = 1;
                break;
            }
        }
        if(flag == 1) break;
        ret = true;
        break;
    }
    if(cntNum(1,cnt) &&ret == true && !isHaveCnt(2,4)) return true;
    return false;
}
bool isWin(){
    if(player[1][13] && player[1][14]) return true;
    if(player[2][13] && player[2][14]) return false;
    for(int i = 1;i <= 4;i ++)
        if(checkOneToFour(i)) return true;
    if(!isHaveCnt(1,4) && isHaveCnt(2,4)) return false;
    int len1 = strlen(s[1]);
    int len2 = strlen(s[2]);
    if(len1 <= len2) return false;
    if(isHaveCnt(1,3)){
        if(len2 == 3) return true;
        if((isHaveCnt(1,2) || cntNum(1,3) >1) && !isHaveCnt(2,2) && cntNum(2,3) < 2) return true;
    }else if(isHaveCnt(1,4)){
        if(len1 == 6) return true;
        else return false;
    }
    return false;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s%s",s[1],s[2]);
        init(1),init(2);
        int flag(0);
        int len = strlen(s[1]);
        if(len <= 6){
            if(len == 1) printf("Yes
"),flag = 1;
            if(len == 2){
                if(cntNum(1,2)) printf("Yes
"),flag = 1;
            }else if(len == 3){
                if(cntNum(1,3)) printf("Yes
"),flag = 1;
            }else if((isHaveCnt(1,4) && len != 5) || (isHaveCnt(1,3) && len != 5)) printf("Yes
"),flag = 1;
            else if(len == 5){
                if(cntNum(1,2) == 1 && cntNum(1,3) == 1) printf("Yes
"),flag = 1;
            }
        }
        if(flag) continue;
        if(isWin()) printf("Yes
");
        else printf("No
");
    }
    return 0;
}


原文地址:https://www.cnblogs.com/anhuizhiye/p/3933127.html