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发展非常迅速,综合 ...
随机推荐
- 第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)
学习<Windows程序设计>记录 概念贴士: 1. 线程描述了进程内代码的执行路径. 2. _stdcall是新标准C/C++函数的调用方法.从底层来说,使用这种调用方法参数的进栈顺序和 ...
- windows 8 设置hyper-v网络设置
1 windwos 8 设置hyperv 比较简单,和装操作系统都不多做解释.我只多说说网络的设置问题,因为可能装提windows 2008虚拟机,根据网上设置网络的方式都是要不然只能虚拟 机上网 , ...
- thinkPHP学习笔记(2)
1.调试模式 设置调试模式部分代码如下: <?php define('APP_DEBUG',TRUE); // 开启调试模式 常量定义代码 require '/ThinkPHP框架所在目录/Th ...
- 转:Web App开发入门
WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...
- 桥牌笔记 Skill Level 4 C7 小心将吃
南主打5H. 看来问题不大,但要小心南的方块AK会阻塞桥路. 如果方块3-2分布,并且将牌也3-2分布,就很容易. 如果红桃4-1分布,那是死定了. 如果方块4-1分布,还有希望完成的! 为了防止东家 ...
- C语言内存对齐详解
一.字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型 ...
- 【读书笔记】iOS-属性列表
一,在Cocoa中,有一类名为属性列表的对象,常简写为plist.这些列表包含Cocoa知道如何操作的一组对象.具体来讲,Cocoa如何知道将这们保存在文件中并进行加载.属性列表类包括NSArray, ...
- 安卓第六天笔记--ListView
安卓第六天笔记--ListView 1.AdapteView AdapteView 继承ViewGroup它的本质是容器 AdapterView派生了3个子类: AbsListView AbsSpin ...
- 基础学习day09--内部类
一.内部类 1.1.内部类概念 定义在一个类内部中的另一个类,被称为内部类 特点: 可以直接访问,内部类的外部类中的,成员属性和方法(包含-private) 外部类要访问内部类中的成员和方法,需要先建 ...
- CSS(一)
开始学习css之旅:先照样式做一个 一.使用DIV设置 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...