2014 HDU多校弟六场J题 【模拟斗地主】

这是一道5Y的题目

有坑的地方我已在代码中注释好了 QAQ

Ps:模拟题还是练的太少了,速度不够快诶

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <climits>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;

const int INF = 0x3f3f3f3f;
const int MAXN = 1001;

char array_a[30], array_b[30];
int store_a[16], store_b[16];
char rules[16];
bool ans;

int find_rank(char num){
    for(int i = 1; i <= 15; ++i){
        if(rules[i] == num){
            return i;
        }
    }
}

void init(){
    ans = false;
    rules[1] = ‘3‘, rules[2] = ‘4‘, rules[3] = ‘5‘, rules[4] = ‘6‘;
    rules[5] = ‘7‘, rules[6] = ‘8‘, rules[7] = ‘9‘, rules[8] = ‘T‘;
    rules[9] = ‘J‘, rules[10] = ‘Q‘, rules[11] = ‘K‘, rules[12] = ‘A‘;
    rules[13] = ‘2‘, rules[14] = ‘X‘, rules[15] = ‘Y‘;

    memset(store_a, 0, sizeof(store_a));
    memset(store_b, 0, sizeof(store_b));
    for(int i = 0; i < strlen(array_a); ++i)
        ++store_a[find_rank(array_a[i])];
    for(int i = 0; i < strlen(array_b); ++i)
        ++store_b[find_rank(array_b[i])];
}

bool lose(){
    int i, j;
    if(store_b[14] == 1 && store_b[15] == 1)    return true;
    for(i = 1; i <= 13; ++i)
        if(store_b[i] == 4) return true;
    return false;
}

bool way_2(){
    int i, j;
    int get_a_max, get_b_max;
    if(lose())  return false;
    for(i = 15; i >= 1; --i){
        if(store_a[i]){
            get_a_max = i;
            break;
        }
    }
    for(i = 15; i >= 1; --i){
        if(store_b[i]){
            get_b_max = i;
            break;
        }
    }
    if(get_a_max >= get_b_max)  return true;
    return false;
}

bool way_3(){
    int i, j;
    if(store_a[14] == 1 && store_a[15] == 1)    return true;
    if(way_2()) return true;
    if(lose())  return false;
    int get_a_max, get_b_max;
    get_a_max = get_b_max = 0;//get_*_max init 0
    for(i = 13; i >= 1; --i){
        if(store_a[i] == 2){
            get_a_max = i;
            break;
        }
    }
    for(i = 13; i >= 1; --i){
        if(store_b[i] == 2){
            get_b_max = i;
            break;
        }
    }
    if(get_a_max == 0)  return false;//if get_*_max is still 0 , return false
    else if(get_a_max >= get_b_max)  return true;
    return false;
}

bool way_4(){
    int i, j;
    if(way_3()) return true;
    if(lose())  return false;

    int get_a_max, get_b_max;
    get_a_max = get_b_max = 0;//
    for(i = 13; i >= 1; --i){
        if(store_a[i] == 3){
            get_a_max = i;
            break;
        }
    }
    for(i = 13; i >= 1; --i){
        if(store_b[i] == 3){
            get_b_max = i;
            break;
        }
    }
    if(get_a_max == 0)  return false;//
    else if(get_a_max >= get_b_max)  return true;
    return false;
}

bool way_5(){
    int i, j;
    if(way_4()) return true;
    if(store_b[14] == 1 && store_b[15] == 1)    return false;

    int num_a = 0, num_b = 0;
    for(i = 1; i <= 15; ++i){
        if(store_a[i] >= 4){
            num_a = i;
            break;
        }
    }
    for(i = 1; i <= 15; ++i){
        if(store_b[i] >= 4){
            num_b = i;
            break;
        }
    }
    if(num_a == 0)  return false;
    else if(num_a >= num_b)  return true;
    return false;
}

bool way_6(){
    int i, j;
    if(way_5()) return true;
    if(store_b[14] == 1 && store_b[15] == 1)    return false;

    return false;
}

bool first_out(){
    int count = 0;
    int i, j, k;
    for(i = 1; i <= 15; ++i){
        if(store_a[i])  count += store_a[i];
    }
    if(0 == count){
        return true;
    } else if(1 == count){
        return true;
    } else if(2 == count){
        if(store_a[14] == 1 && store_a[15] == 1){
            return true;
        } else{
            for(i = 1; i <= 13; ++i){
                if(store_a[i] == 2){
                    return true;
                }
            }

            if(way_2()) return true;
            return false;
        }
    } else if(3 == count){
        for(i = 1; i <= 13; ++i){
            if(store_a[i] == 3){
                return true;
            }
        }

        if(way_3()) return true;
        return false;
    } else if(4 == count){
        for(i = 1; i <= 15; ++i){
            if(store_a[i] >= 3){
                return true;
            }
        }

        if(way_4()) return true;
        return false;
    } else if(5 == count){
        int count_a = 0, count_b = 0;
        for(i = 1; i <= 15; ++i){
            if(store_a[i] == 3) ++count_a;
            else if(store_a[i] == 2 && i <= 13) ++count_b;
        }
        if(count_a && count_b){
            return true;
        }

        if(way_5()) return true;//
        return false;
    } else if(6 == count){
        int count_a = 0;
        for(i = 1; i <= 15; ++i){
            if(store_a[i] == 4) ++count_a;
        }
        if(count_a){
            return true;
        }

        if(way_6()) return true;//
        return false;
    }

    if(way_6()) return true;
    return false;
}

void debug(){
    for(int i = 1; i <= 15; ++i){
        printf("%-2d", store_a[i]);
    }
    printf("\n");
    for(int i = 1; i <= 15; ++i){
        printf("%-2d", store_b[i]);
    }
    printf("\n");
}

int main(){
    int i, j, k, numCase;
    scanf("%d",&numCase);
    while(numCase--){
        scanf("%s",array_a);
        scanf("%s",array_b);
        init();
        //debug();
        if(first_out()){
            printf("Yes\n");
        } else{
            printf("No\n");
        }
    }
    return 0;
}

2014 HDU多校弟六场J题 【模拟斗地主】

时间: 2024-10-07 01:21:37

2014 HDU多校弟六场J题 【模拟斗地主】的相关文章

2014 HDU多校弟五场J题 【矩阵乘积】

题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存开辟都开不出来 1 #pragma comment(linker, "/STACK:16777216") 2 #include <iostream> 3 #include <stdio.h> 4 #define ll long long 5 using namesp

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //

2014 HDU多校弟五场A题 【归并排序求逆序对】

这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的方法,可以拿来当模板 TVT 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream&g

2014 HDU多校弟八场H题 【找规律把】

看了解题报告,发现看不懂 QAQ 比较简单的解释是这样的: 可以先暴力下达标,然后会发现当前数 和 上一个数 的差值是一个 固定值, 而且等于当前数与i(第i个数)的商, 于是没有规律的部分暴力解决,有规律的套公式 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <cstring&g

HDU 4923 Room and Moor (多校第六场C题) 单调栈

Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that: Input The inp

hdu多校第六场1008 (hdu6641)TDL 暴力

题意: 设f(n,m)为比n大的第m个和n互质的数,给定一个k=(f(n,m)-n)xor n和m,求最小的n 题解: 对于给定的m而言,一个k周围合法的n分布的很密,因此在k的邻域暴力搜索即可. #include<iostream> #define LL long long using namespace std; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } bool solve(LL n,LL k,int m){ //找到n后面的第m个互质

2014多校第六场 1005 || HDU 4925 Apple Tree

题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两倍,如果(i,j)有一颗苹果树,(i-1,j)与(i,j+1)施了肥,那么苹果应该是1的两倍2,2的两倍4,最后是4个苹果,问你怎么安排苹果和施肥的格子使最后得到的苹果最多. 思路 : 画了图就可以看出来,苹果和苹果,肥与肥之间不要相邻就好了,所有的苹果之间都有施肥,所有施肥的格子都被苹果隔开了才能

2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)

题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std ; 6 7 char str1[20],str2[20] ; 8 int hash1[20],hash2[2

【HDU】4923 Room and Moor(2014多校第六场1003)

Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 263    Accepted Submission(s): 73 Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0