题意:两个人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,较复杂模拟的更多相关文章

  1. HDU 4930 Fighting the Landlords(暴力枚举+模拟)

    HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...

  2. HDU 4930 Fighting the Landlords(扯淡模拟题)

    Fighting the Landlords 大意: 斗地主... . 分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black ...

  3. HDU 4930 Fighting the Landlords(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没 ...

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

    题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...

  5. 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 ...

  6. hdu4930 Fighting the Landlords(模拟 多校6)

    题目链接:pid=4930">http://acm.hdu.edu.cn/showproblem.php? pid=4930 Fighting the Landlords Time L ...

  7. HDU4930 Fighting the Landlords 模拟

    Fighting the Landlords Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  8. hdu 4930 斗地主恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...

  9. HDOJ(HDU) 2109 Fighting for HDU(简单排序比较)

    Problem Description 在上一回,我们让你猜测海东集团用地的形状,你猜对了吗?不管结果如何,都没关系,下面我继续向大家讲解海东集团的发展情况: 在最初的两年里,HDU发展非常迅速,综合 ...

随机推荐

  1. 【图解】Eclipse下JRebel6.2.0热部署插件安装、破解及配置【转】

    标签: 这两天在做后台管理系统,前端框架用Bootstrap,后端用SpringMVC+Velocity.在开发过程中,经常需要对界面进行微调,调整传参等,每次更改一次java代码,就得重新部署一次, ...

  2. C语言范例学习03-下

    树与图 3.5 二叉树及其应用 PS:二叉树是最经典的树形结构,适合计算机处理,具有存储方便和操作灵活等特点,而且任何树都可以转换成二叉树. 实例101 二叉树的递归创建 实例102 二叉树的遍历 问 ...

  3. java微信开发框架wechat4j入门教程

    wechat4j What is wechat4j? wechat develop framework for java(微信开发框架JAVA版,最简单易用微信开发框架) wechat4j可以用来干什 ...

  4. 使用svcutil.exe 工具来生成调用文件

    svcutil.exe http://localhost:9065/ServiceDemo.svc?wsdl 这将生成一个配置文件和一个包含客户端类的代码文件. 下面我们就用这个是怎么生成的: 1,打 ...

  5. SQL对字符串数组的处理详解

    原文地址:SQL字符串数组操作文章出处:DIY部落(http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/76999.html) ...

  6. Vue列表渲染

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson09 一 for循环数组 <!DOCTYPE html> ...

  7. andriod 动态创建控件

    Button btNext=(Button)findViewById(R.id.next); btNext.setOnClickListener(new Button.OnClickListener( ...

  8. 关于ApplicationPoolIdentity

    一直以来IIS中的网站默认都是以network service在运行,但是从IIS7开始,默认会以ApplicationPoolIdentity运行. 这个账户比较特殊,是一种虚拟帐户,你无法在计算机 ...

  9. 在Android开发中使用Ant 一:环境的搭建及入门

    配置Ant环境 下载Ant:http://ant.apache.org/bindownload.cgi 在windows上应该选择zip压缩包,将zip压缩包解压到一个目录. 打开系统环境变量,在系统 ...

  10. win7开启休眠功能

    win7有的系统默认关机选项没有休眠功能,其实是没打开. cmd-> powercfg -hibernate on   即可