zoukankan      html  css  js  c++  java
  • HDU 4930 Fighting the Landlords(暴力枚举+模拟)

    HDU 4930 Fighting the Landlords

    题目链接

    题意:就是题中那几种牌型。假设先手能一步走完。或者一步让后手无法管上,就赢

    思路:先枚举出两个人全部可能的牌型的最大值。然后再去推断就可以

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    struct Player {
        int rank[15];
    } p1, p2;
    
    int t, hash[205], cnt[(1<<20)], vis[20];
    char a[25], b[25];
    
    int bitcount(int x) {
        int ans = 0;
        while (x) {
    	ans += (x&1);
    	x >>= 1;
        }
        return ans;
    }
    
    void add(int num, Player &p) {
        if (num == 2) {
    	if (vis[14] && vis[15]) {
    	    p.rank[7] = 14;
    	    return;
    	}
        }
        if (num == 5) {
    	int a = 0, b = 0;
    	for (int i = 15; i >= 1; i--) {
    	    if (vis[i] == 3) a = i;
    	    if (vis[i] == 2) b = i;
    	}
    	if (a && b) {
    	    p.rank[5] = max(p.rank[5], a);
    	}
    	return;
        }
        for (int i = 15; i >= 1; i--) {
    	if (num == 4 && vis[i] == 4) {
    	    p.rank[7] = max(p.rank[7], i);
    	    return;
    	}
    	if (num == 4 && vis[i] == 3) {
    	    p.rank[4] = max(p.rank[4], i);
    	    return;
    	}
    	if (num == 6 && vis[i] == 4) {
    	    p.rank[6] = max(p.rank[6], i);
    	    return;
    	}
    	if (vis[i] == num) {
    	    p.rank[num] = max(p.rank[num], i);
    	    return;
    	}
        }
    }
    
    void build(char *a, Player &p) {
        memset(p.rank, 0, sizeof(p.rank));
        int n = strlen(a);
        int maxs = (1<<n);
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < maxs; i++) {
    	if (cnt[i] > 6) continue;
    	memset(vis, 0, sizeof(vis));
    	for (int j = 0; j < n; j++) {
    	    if (i&(1<<j)) {
    		vis[hash[a[j]]]++;
    	    }
    	}
    	add(cnt[i], p);
        }
    }
    
    bool solve() {
        int n = strlen(a);
        if (n == 4) {
    	if (p1.rank[7]) return true;
        }
        if (n <= 6) {
    	if (p1.rank[n]) return true;
        }
        if (p1.rank[7] && p2.rank[7]) return p1.rank[7] > p2.rank[7];
        if (p1.rank[7] && !p2.rank[7]) return true;
        if (!p1.rank[7] && p2.rank[7]) return false;
        for (int i = 1; i < 7; i++) {
    	if (p1.rank[i] > p2.rank[i]) return true;
        }
        return false;
    }
    
    int main() {
        for (int i = 0; i < (1<<20); i++)
    	cnt[i] = bitcount(i);
        for (int i = 3; i <= 9; i++)
    	hash[i + '0'] = i - 2;
        hash['T'] = 8; hash['J'] = 9; hash['Q'] = 10; hash['K'] = 11;
        hash['A'] = 12; hash['2'] = 13; hash['X'] = 14; hash['Y'] = 15;
        scanf("%d", &t);
        while (t--) {
    	scanf("%s%s", a, b);
    	build(a, p1);
    	build(b, p2);
    	if (solve()) printf("Yes
    ");
    	else printf("No
    ");
        }
        return 0;
    }


  • 相关阅读:
    Monkey写脚本
    Appium+JAVA初试牛刀之安装APP
    新安家啦
    SRAM速度提升思路及方法
    FIR滤波器工作原理(算法)以及verilog算法实现(包含与IIR的一些对比)
    I2C总线协议详解
    有符号二进制加法溢出判断以及溢出后该如何计算正确答案
    Verilog 编写规范
    Android中锁屏密码算法解析以及破解方案
    IIS中查看W3P.exe进程对应的应用程序池的方法
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7045145.html
Copyright © 2011-2022 走看看