注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fudq's AC Road

何以解忧,唯有AC!

 
 
 

日志

 
 

hdu 4930 Fighting the Landlords  

2014-08-07 17:26:05|  分类: ACM-hdu |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://acm.hdu.edu.cn/showproblem.php?pid=4930
多校合练第6场1010.
这题模拟题,就是斗地主,一些细节地方处理好就没问题了。
这题比较爽,打完测了样例一发就过了。

char a[21],b[21];
int vis1[12],vis2[31];
int n_dan[2],dan[2][21];
int n_dui[2],dui[2][21];
int n_san[2],san[2][21];
int n_bomb[2],bomb[2][21];

void deal1(char p,int q,int pos)
{
int t=p-'A';
if(vis2[t])
{
if(vis2[t] == 1) dan[pos][n_dan[pos]++]=q;
else if(vis2[t] == 2) dui[pos][n_dui[pos]++]=q;
else if(vis2[t] == 3) san[pos][n_san[pos]++]=q;
else if(vis2[t] == 4) bomb[pos][n_bomb[pos]++]=q;
}
}

void init(int pos,char a[])
{
int lena=LEN(a);
MEM(vis1);MEM(vis2);
fr(lena){
if(a[i] == '2')
a[i]='Z';
if(a[i]<='9' && a[i]>='0')
vis1[a[i]-'0']++;
else
vis2[a[i]-'A']++;
}
n_dan[pos]=n_dui[pos]=n_san[pos]=n_bomb[pos]=0;
for(int i=0;i<10;i++)
{
if(!vis1[i]) continue;
if(vis1[i] == 1)
{
dan[pos][n_dan[pos]++]=i;
continue;
}
if(vis1[i] == 2)
{
dui[pos][n_dui[pos]++]=i;
continue;
}
if(vis1[i] == 3)
{
san[pos][n_san[pos]++]=i;
continue;
}
if(vis1[i] == 4)
{
bomb[pos][n_bomb[pos]++]=i;
continue;
}
}
deal1('T',10,pos);deal1('J',11,pos);deal1('Q',12,pos);deal1('K',13,pos);
deal1('A',14,pos);deal1('Z',15,pos);deal1('X',16,pos);deal1('Y',17,pos);
sort(dan[pos],dan[pos]+n_dan[pos]);sort(dui[pos],dui[pos]+n_dui[pos]);
sort(san[pos],san[pos]+n_san[pos]);sort(bomb[pos],bomb[pos]+n_bomb[pos]);
}

int jud1()
{
if(n_dan[0] >= 2 && dan[0][n_dan[0]-1] == 17 && dan[0][n_dan[0]-2] == 16) return 1; //我有王炸
if(n_dan[0]+n_dui[0]+n_san[0]+n_bomb[0] == 1) return 1; //只有一顺牌
if(n_dan[0] == 1 && n_dui[0] == 0 && n_san[0] == 1 && n_bomb[0] == 0) return 1; //3带1
if(n_dan[0] == 0 && n_dui[0] == 1 && n_san[0] == 1 && n_bomb[0] == 0) return 1; //3带1对
if(n_dan[0] == 2 && n_dui[0] == 0 && n_san[0] == 0 && n_bomb[0] == 1) return 1; //4带2
if(n_dan[0] == 0 && n_dui[0] == 1 && n_san[0] == 0 && n_bomb[0] == 1) return 1; //4带1对
if(n_dan[1] >= 2 && dan[1][n_dan[1]-1] == 17 && dan[1][n_dan[1]-2] == 16) return 0; //对手有王炸
return 0;
}

int jud2()
{
//bomb
if(n_bomb[0] && !n_bomb[1]) return 1; //如果我有炸,对手没有
if(!n_bomb[0] && n_bomb[1]) return 0; //如果我没有炸,对手有
if(n_bomb[0])
{
if(bomb[0][n_bomb[0]-1] >= bomb[1][n_bomb[1]-1]) return 1; //炸弹比对手大
return 0;
}

//san
if(n_san[0] && !n_san[1]) return 1; //对手没有三个
if(n_san[0] && n_san[1])
{
if(san[0][n_san[0]-1] >= san[1][n_san[1]-1]) return 1; //三个比对手大
if(n_dui[0] && !n_dui[1]) return 1; //对手没有对子,出3带对
}
if(n_san[1]) //如果对方有三个,我没有三个,把对方的三个拆成1个对和1个单
{
for(int i=0;i<n_san[1];i++)
{
dan[1][n_dan[1]++]=san[1][i];
dui[1][n_dui[1]++]=san[1][i];
}
sort(dan[1],dan[1]+n_dan[1]);
sort(dui[1],dui[1]+n_dui[1]);
}

//dui
if(n_dui[0] && !n_dui[1]) return 1; //对方没有对
if(n_dui[0] && n_dui[1] && dui[0][n_dui[0]-1] >= dui[1][n_dui[1]-1]) return 1; //对子比对方大
if(n_dui[1])
{
for(int i=0;i<n_dui[1];i++)
dan[1][n_dan[1]++]=dui[1][i];
sort(dan[1],dan[1]+n_dan[1]);
}

//dan
if(!n_dan[0]) return 0;
if(n_dan[0] && !n_dan[1]) return 1;
if(n_dan[0] && n_dan[1] && dan[0][n_dan[0]-1] >= dan[1][n_dan[1]-1]) return 1;
return 0;
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("testin.txt", "r", stdin);
// freopen("testout.txt", "w", stdout);
#endif
int T;
sf(T);
while(T--)
{
sf2s(a,b);
init(0,a);
init(1,b);
if(jud1())
{
pfs("Yes");
continue;
}
if(jud2()) pfs("Yes");
else pfs("No");
}
return 0;
}


  评论这张
 
阅读(64)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017