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\n");
else printf("No\n");
}
return 0;
}

最新文章

  1. 许愿墙的搭建(基于Apache+php+mysql)
  2. 防御病毒邮件得看U-Mail邮件网关
  3. python爬取并下载麦子学院所有视频教程
  4. ubuntu使用root用户登录/切换root权限
  5. NET-SNMP配置
  6. editplus格式化xml文档
  7. SVN客户端解决authorization failed问题
  8. Android selector item 属性大全(按钮按下不同效果)
  9. listview中button抢占焦点问题
  10. 数据库插入数据失败,log提示不能将值 NULL 插入列 &#39;id&#39;
  11. python selenium报错整理
  12. dedecms 图集标签{dede:productimagelist} {dede:field name='imgurls'}&nbs
  13. 《前端之路》之 JavaScript原型及原型链详解
  14. mysql 案例 ~超时时间设置
  15. python 获取本机的IP
  16. Django学习(6)配置静态文件
  17. ActiveMQ的安装与配置
  18. Linux 安装mysql,mariadb,mysql主从同步
  19. easyui validatebox textbox 使用例子
  20. 【WPF】树形结构TreeView的用法(MVVM)

热门文章

  1. jvm 堆、栈 、方法区概念和联系
  2. 创业笔记-Node.js入门之一个完整的基于Node.js的web应用
  3. POJ 3749
  4. poj3101--Astronomy(分数的最小公倍数)
  5. 关于 折半查找 while 条件 &amp;lt; , &amp;lt;=
  6. $(window).load(function(){})跟$(document).ready(function(){})跟$(function(){})区别
  7. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
  8. select into in mysql
  9. [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)
  10. vue 初始化项目模板报错