题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930
4 33A 2 33A 22 33 22 5559T 9993
Yes No Yes Yes
题目意思:
两个人设为A和B,A和B在打斗地主,上面一行是A手里的牌,下面一行是B手里的牌,若A第一次出牌B压不住或者A一次就把牌出完了,那么输出Yes,否则若A牌没出完而且被B压住了那么输出No。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 26
char s1[M], s2[M];
int c1[M], c2[M];
int a1[M], a2[M];
int b1[M], b2[M];
int len1, len2;
int max(int a, int b)
{
return a > b ? a:b;
}
void init()
{
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(a2,0,sizeof(a1));
memset(b2,0,sizeof(b2));
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
}
int f(char c)
{
if(c >= '3' && c <= '9')
return c -'2';
if(c == 'T')
return 8;
if(c == 'J')
return 9;
if(c == 'Q')
return 10;
if(c == 'K')
return 11;
if(c == 'A')
return 12;
if(c == '2')
return 13;
if(c == 'X')
return 14;
if(c == 'Y')
return 15;
}
void Find(int *c, int flag)
{
int i;
int a[6], b[6];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i = 1; i <= 13; i++)
{
if(c[i])
{
b[1] = max(b[1],i);
if(c[i] == 1)//单张
{
a[1]++;
}
else if(c[i] == 2)//对子
{
a[2]++;
b[2] = max(b[2],i);
}
else if(c[i] == 3)//三个的
{
a[3]++;
b[3] = max(b[3],i);
}
else if(c[i] == 4)//炸弹
{
a[4]++;
b[4] = max(b[4],i);
}
}
}
if(c[14] && c[15])//双王
{
b[1] = 15;
a[5]++;
}
else if(c[15])//大王
{
b[1] = 15;
}
else if(c[14])//小王
{
b[1] = 14;
}
for(i = 1; i <= 5; i++)
{
if(flag == 1)
{
a1[i] = a[i];
b1[i] = b[i];
}
else if(flag == 2)
{
a2[i] = a[i];
b2[i] = b[i];
}
}
}
void solve()
{
int i, j;
int flag1, flag2;
int n1=strlen(s1);
int n2=strlen(s2);
if((n1==1)||(n1==2&&a1[2])||(n1==3&&a1[3])||(n1==4&&(a1[4]||a1[3]))||(n1==5&&a1[2]&&a1[3])||(n1==6&&a1[2]&&a1[4]))
{
printf("Yes\n");//一次出完
}
else if(a1[5])
{
printf("Yes\n"); //A手里有王炸
}
else if(a2[5])
{
printf("No\n"); //B手里有王炸
}
else if(b1[4]>b2[4])
{
printf("Yes\n"); //A手里的炸弹比B手里的炸弹大
}
else if(b1[4]<b2[4]) //反之
{
printf("No\n");
}
else if(b1[1]>b2[1]) //出单,且单比B的大
{
printf("Yes\n");
}
else if(b1[2]>b2[2]) //出对,且对比B的大
{
printf("Yes\n");
}
else if(b1[3]&&(b1[3]>b2[3]||(b1[1]&&!b2[1])||(b1[2]&&!b2[2])))
{ //出3张时,可以带1张也可以带2张也可以不带,依次判断
printf("Yes\n");
}
else
{
printf("No\n");
}
}
int main()
{
int t;
int i, j;
scanf("%d",&t);
while(t--)
{
init();
scanf("%s",s1);
scanf("%s",s2);
len1 = strlen(s1);
len2 = strlen(s2);
for(i = 0; i < len1; i++)
{
c1[f(s1[i])]++;
}
for(i = 0; i < len2; i++)
{
c2[f(s2[i])]++;
}
Find(c1, 1);
Find(c2, 2);
solve();
}
return 0;
}hdu4930 Fighting the Landlords(模拟 多校6),布布扣,bubuko.com
hdu4930 Fighting the Landlords(模拟 多校6)
原文地址:http://blog.csdn.net/u012860063/article/details/38437311