HDU 4930 Fighting the Landlords --多Trick,较复杂模拟
题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No。
解法:知道规则,看清题目,搞清有哪些Trick,就可以直接模拟搞了。详见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 100102
#define M 22 char s1[],s2[];
int A[],B[];
int cnt1[],cnt2[]; int main()
{
int n,i,j;
int n1,n2;
scanf("%d",&n);
while(n--)
{
priority_queue<int> Single,Pair,Tri,Four,Nuke;
priority_queue<int> Single2,Pair2,Tri2,Four2,Nuke2;
scanf("%s",s1);
scanf("%s",s2);
n1 = strlen(s1);
n2 = strlen(s2);
for(i=;i<n1;i++)
{
if(s1[i] >= '' && s1[i] <= '')
A[i] = s1[i]-'';
else if(s1[i] == 'T')
A[i] = ;
else if(s1[i] == 'J')
A[i] = ;
else if(s1[i] == 'Q')
A[i] = ;
else if(s1[i] == 'K')
A[i] = ;
else if(s1[i] == 'A')
A[i] = ;
else if(s1[i] == '')
A[i] = ;
else if(s1[i] == 'X')
A[i] = ;
else if(s1[i] == 'Y')
A[i] = ;
}
for(i=;i<n2;i++)
{
if(s2[i] >= '' && s2[i] <= '')
B[i] = s2[i]-'';
else if(s2[i] == 'T')
B[i] = ;
else if(s2[i] == 'J')
B[i] = ;
else if(s2[i] == 'Q')
B[i] = ;
else if(s2[i] == 'K')
B[i] = ;
else if(s2[i] == 'A')
B[i] = ;
else if(s2[i] == '')
B[i] = ;
else if(s2[i] == 'X')
B[i] = ;
else if(s2[i] == 'Y')
B[i] = ;
}
sort(A,A+n1);
sort(B,B+n2);
memset(cnt1,,sizeof(cnt1));
memset(cnt2,,sizeof(cnt2));
for(i=;i<n1;i++) //计算A各种牌的个数
cnt1[A[i]]++;
for(i=;i<n2;i++) //计算B各种牌的个数
cnt2[B[i]]++;
for(i=;i<=;i++)
{
if(cnt1[i] == ) //出现四个,可以做四个出,可以做三个出,也可以做两个或一个出
Four.push(i),Tri.push(i),Pair.push(i),Single.push(i);
else if(cnt1[i] == )
Tri.push(i),Pair.push(i),Single.push(i);
else if(cnt1[i] == )
Pair.push(i),Single.push(i);
else if(cnt1[i] == )
Single.push(i);
}
for(i=;i<=;i++)
{
if(cnt2[i] == )
Four2.push(i),Tri2.push(i),Pair2.push(i),Single2.push(i);
else if(cnt2[i] == )
Tri2.push(i),Pair2.push(i),Single2.push(i);
else if(cnt2[i] == )
Pair2.push(i),Single2.push(i);
else if(cnt2[i] == )
Single2.push(i);
}
if(cnt1[]) //有王,可以做单个出
Nuke.push(),Single.push();
if(cnt1[])
Nuke.push(),Single.push();
if(cnt2[])
Nuke2.push(),Single2.push();
if(cnt2[])
Nuke2.push(),Single2.push();
if(Nuke.size() >= ) //双王,直接赢
{
puts("Yes");
continue;
}
//-------------------------------下面判断能否一次出完
if(n1 == )
{
puts("Yes");
continue;
}
if(n1 == )
{
if(A[] == A[])
{
puts("Yes");
continue;
}
}
if(n1 == )
{
if(A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
}
if(n1 == )
{
if(A[] == A[] && A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
if(A[] != A[] && A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
if(A[] != A[] && A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
}
if(n1 == )
{
if(A[] == A[] && A[] != A[] && A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
if(A[] == A[] && A[] != A[] && A[] == A[] && A[] == A[])
{
puts("Yes");
continue;
}
}
if(n1 == )
{
int tag = ;
for(i=;i<=;i++)
{
if(A[i] == A[i+] && A[i+] == A[i+] && A[i+] == A[i+])
{
tag = ;
break;
}
}
if(tag)
{
puts("Yes");
continue;
}
}
//-----------------------------如果不能一次出完
if(Nuke2.size() >= ) //对方有双王,必输
{
puts("No");
continue;
}
if(!Nuke.empty() && Nuke2.empty()) //A有王,B没王
{
puts("Yes");
continue;
}
if(!Nuke.empty() && !Nuke2.empty()) //都有王,看谁的大,如果A小,则不选择出王,继续
{
if(Nuke.top() > Nuke2.top())
{
puts("Yes");
continue;
}
}
if(Four.empty() && !Four2.empty()) //炸弹,如果不能一次出完又没炸弹,那么必会被炸,输
{
puts("No");
continue;
}
if(!Four.empty() && Four2.empty()) //有炸弹出炸弹
{
puts("Yes");
continue;
}
if(!Four.empty() && !Four2.empty()) //都有炸弹,A的如果小,因为不能一次出完,必输
{
if(Four.top() >= Four2.top())
{
puts("Yes");
continue;
}
else
{
puts("No");
continue;
}
}
if(!Tri.empty() && Tri2.empty()) //三个的情况
{
puts("Yes");
continue;
}
if(!Tri.empty() && !Tri2.empty())
{
if(Tri.top() >= Tri2.top())
{
puts("Yes");
continue;
}
else if(n1 >= && n2 <= ) //A有的带,B没得带
{
puts("Yes");
continue;
}
}
if(!Pair.empty() && Pair2.empty()) //对子
{
puts("Yes");
continue;
}
if(!Pair.empty() && !Pair2.empty())
{
if(Pair.top() >= Pair2.top())
{
puts("Yes");
continue;
}
}
if(Single.empty() && !Single2.empty()) //单个牌
{
puts("No");
continue;
}
if(!Single.empty() && Single2.empty())
{
puts("Yes");
continue;
}
if(!Single.empty() && !Single2.empty())
{
if(Single.top() >= Single2.top())
{
puts("Yes");
continue;
}
}
puts("No"); //如果以上都不满足,那么A输了,gg。
}
return ;
}
HDU 4930 Fighting the Landlords --多Trick,较复杂模拟的更多相关文章
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...
- HDU 4930 Fighting the Landlords(扯淡模拟题)
Fighting the Landlords 大意: 斗地主... . 分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black ...
- HDU 4930 Fighting the Landlords(模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没 ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...
- hdu4930 Fighting the Landlords(模拟 多校6)
题目链接:pid=4930">http://acm.hdu.edu.cn/showproblem.php? pid=4930 Fighting the Landlords Time L ...
- HDU4930 Fighting the Landlords 模拟
Fighting the Landlords Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu 4930 斗地主恶心模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...
- HDOJ(HDU) 2109 Fighting for HDU(简单排序比较)
Problem Description 在上一回,我们让你猜测海东集团用地的形状,你猜对了吗?不管结果如何,都没关系,下面我继续向大家讲解海东集团的发展情况: 在最初的两年里,HDU发展非常迅速,综合 ...
随机推荐
- PHP系列之一traits的应用
Traits 在PHP中实现在方法的重复使用:Traits与Class相似,但是它能够在Class中使用自己的方法而不用继承: Traits在Class中优先于原Class中的方法,引用PHP Doc ...
- 字典集合Dictionary<K,V>和构造的应用==>>体检套餐项目
效果 首先,我们先来准备我们需要的类 1.检查项目类 using System; using System.Collections.Generic; using System.Linq; using ...
- Erlang高阶函数
对于函数式语言来说,函数也想普通的数据类型一样无处不在.函数即可以当成参数进行传递,也可以当成函数的返回值.当我第一次学习函数式编程的时候,我被这样的写法弄的头昏脑涨.下面我举例说明下(例子摘录自Le ...
- Jquery学习—jquery的事件
1.Jquery事件1:one 1)one() 方法是为所选的元素绑定一个仅出发一次的处理函数,调用格式 one(type,[data],fn) 2)其中参数type是事件类型,即需要触发什么类型的事 ...
- jquery 监控文本框键盘事件(回车事件),附常用keycode值。
$(function(){ $(".search").keydown(function(event) { ) { //执行操作 } }) ); 完整的 key press 过程分为 ...
- WCF服务部署到IIS7.5
下面介绍如何把WCF服务部署到IIS: 为WCF服务创建.svc文件 我们知道,每一个ASP.NET Web服务都具有一个.asmx文本文件,客户端通过访问.asmx文件实现对相应Web服务的调用.与 ...
- jQuery源码分析-02正则表达式-RegExp-常用正则表达式
2.4 常用正则表达式在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正. 常用的数字正则(严格匹配) 正则 含义 ^[1-9]\d*$ 匹配正整数 ^-[1 ...
- 扩展SharePoint链接字段
默认SharePoint中的链接字段有很多限制,例如 输入文字的时候只能录入255个字符 链接显示的是文字 点击链接后只能在当前页面打开链接 - - - - - - -- - - - - - - ...
- TCP/IP协议握手过程详解
1,建立连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SE ...
- 汇编语言--寄存器(cpu工作原理)
本文地址:http://www.cnblogs.com/archimedes/p/assembly-register.html,转载请注明源地址. 本文主要将介绍的是8086 CPU中的寄存器, 寄存 ...