题意:两个人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. redis配置注意事项

    最近在看redis方面的官方文档,redis-server的相关配置建议如下: 1.vm.overcommit_memory = 1 2.禁用linux内核特性transparent huge pag ...

  2. js封装tab标签页

    <html> <head> <title></title> <meta charset="UTF-8"> <sty ...

  3. Java集合 Json集合之间的转换

    1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...

  4. CSS3随内容自动伸缩的背景

    CSS3给我们带来一个非常实用的新属性:border-image,利用这个属性我们可以做出随着内容的增减自动伸缩的背景.废话不多说,看代码! HTML: <ol> <li>第一 ...

  5. UUID(uuid)js 生成

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  6. C#将DataTable转化为List<T>

    C#将DataTable转化为List<T> 在使用三层架构开发一个网站时,希望把DataTable对象转换为List<T>对象,于是在网上找资料,总结一个比较方便的方法来实现 ...

  7. 原创:SAP LVC ALV编辑小技巧

    前两天有个打印需求变更,需要在ALV显示列表中添加两个字段,可编辑,而我自己用的是函数:REUSE_ALV_GRID_DISPLAY_LVC 因为之前做可编辑基本都是固定套路,定义类,画屏幕.... ...

  8. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)

    04 }Which code segment should you add at line 03?A. currentItem["ClassificationMetadata"] ...

  9. C语言异常与断言接口与实现

    程序中通常会出现三种错误:用户错误.运行期错误以及异常 欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 标准库函数setjmp和longjmp 在C语言中,标准库函数s ...

  10. IOS真机测试(用证书进行真机测试)

    真机测试需要准备 1.证书 2.Iphone或者Ipad 3.到developer.apple.com注册开发者账号(不用money的) ------------------------------- ...