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


  • 相关阅读:
    UVa-129
    UVa-524
    有点迷茫
    北邮之行~
    UVa-253
    心累--期末考试成绩
    UVa-220 Othello
    UVa-201 Squares
    UVA-1589 Xiangqi
    UVa-213 Message Decoding
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3933127.html
Copyright © 2020-2023  润新知