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发展非常迅速,综合 ...
随机推荐
- redis配置注意事项
最近在看redis方面的官方文档,redis-server的相关配置建议如下: 1.vm.overcommit_memory = 1 2.禁用linux内核特性transparent huge pag ...
- js封装tab标签页
<html> <head> <title></title> <meta charset="UTF-8"> <sty ...
- Java集合 Json集合之间的转换
1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...
- CSS3随内容自动伸缩的背景
CSS3给我们带来一个非常实用的新属性:border-image,利用这个属性我们可以做出随着内容的增减自动伸缩的背景.废话不多说,看代码! HTML: <ol> <li>第一 ...
- UUID(uuid)js 生成
全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...
- C#将DataTable转化为List<T>
C#将DataTable转化为List<T> 在使用三层架构开发一个网站时,希望把DataTable对象转换为List<T>对象,于是在网上找资料,总结一个比较方便的方法来实现 ...
- 原创:SAP LVC ALV编辑小技巧
前两天有个打印需求变更,需要在ALV显示列表中添加两个字段,可编辑,而我自己用的是函数:REUSE_ALV_GRID_DISPLAY_LVC 因为之前做可编辑基本都是固定套路,定义类,画屏幕.... ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)
04 }Which code segment should you add at line 03?A. currentItem["ClassificationMetadata"] ...
- C语言异常与断言接口与实现
程序中通常会出现三种错误:用户错误.运行期错误以及异常 欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 标准库函数setjmp和longjmp 在C语言中,标准库函数s ...
- IOS真机测试(用证书进行真机测试)
真机测试需要准备 1.证书 2.Iphone或者Ipad 3.到developer.apple.com注册开发者账号(不用money的) ------------------------------- ...