A 牛牛
Time Limit:1000MS Memory Limit:65535K
题型: 编程题 语言: 无限制
描述
最近hl看到舍友在回顾星爷,发哥,瓦仔的《赌..》系列电影,然后就跟他们玩起扑克来。扑克里面有一种简单的玩法,叫做“牛牛”.
众所周知,一副扑克除去大小王之后剩下52张。2~9,T(相当于牌10),J,Q,K(J,Q,K的值相当于牌10),A(A作用相当于1) 各 4 张,牛牛的游戏
规则是,“庄家”先给每人派5张牌(包括自己,庄以外的玩家称为“闲家”)。
基本牌型:
1.没牛:5张牌中的任意3张加起来不能成为10的倍数。
2.有牛:5张牌中的存在3张加起来为10的倍数(称为牛),但另外2张不为10的倍数( C=(A+B)%10 , 则称为牛C ) 。
3.牛牛:5张牌中的存在3张加起来为10的倍数,且另外2张也为10的倍数。
4.五花:5张牌全为花(J,Q,K称为花,如Q,J,J,Q,K)。
大小比较:
1.牌型: 五花 > 牛牛 > 有牛(C越大牛越大) > 没牛 。
2.单张:A > K > Q > J > T > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2 。
牌型相同再比较单张。
玩法如下:
闲家每个回合可以向庄家投注,开牌后庄家的牌 >= 闲家的牌的时候,算作庄家赢。
赔率:
五花(1:4),牛牛(1:3),牛9(1:2),其他 (1:1)。
这个时候,轮到了hl做庄,他是星爷的传人,继承了星爷的超能力。
第一个超能力是透视,他能够看到所有闲家是什么牌。
第二个超能力是变牌,他能够使自己底牌变成自己想要的牌。
现在hl已经知道闲家拿着什么牌,闲家也知道hl已经开出来的4张牌,
当然闲家们足够聪明,会把自己的牌尽量大地表示出来。
hl要把底牌变成什么才能让自己赢得最多呢?
输入格式
第1行输入n( 0 < n < 9 ),表示闲家的数量。
第2行输入hl的4张牌。
第 3 ~ n + 3 行,每行分别输入闲家的5张牌还有他们下注的钱Wi( 0 < Wi <= 1000 )。
输出格式
输出一个值,表示hl能赢得最大钱数。
如果hl不能赢钱的话输出 impossible 。
输入样例
1
A9Q8
AAA99 1
输出样例
3
Hint
注意题目改了,没牛的赔率也是1赔1的
单case
Provider
201330330210
模拟题,直接枚举庄能抽到的所有牌求出牌能够的最大表示,排序方面,直接把牌转成数字,把A当成了100,注意下只有一副牌这个坑就好。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct xians
{
int pai[5];
int rmb;
int leixing;
int C;
}xian[100];
int panduan(int n)
{
int k=1;
int zong=0;
for(int i=0;i<5;i++)
{
if(xian[n].pai[i]<=10)
{
k=0;
zong+=xian[n].pai[i];
}
else
zong+=10;
}
if(k)
{
xian[n].leixing=4;
xian[n].C=0;
return 0;
}
int c,d;
for(int i=0;i<4;i++)
{
if(xian[n].pai[i]>10)
c=10;
else
c=xian[n].pai[i];
for(int j=0;j<5;j++)
{
if(xian[n].pai[j]>10)
d=10;
else
d=xian[n].pai[j];
if((zong-c-d)%10==0)
{
if((c+d)%10==0)
{
xian[n].leixing=3;
xian[n].C=0;
return 0;
}
else
{
xian[n].leixing=2;
xian[n].C=(c+d)%10;
return 0;
}
}
}
}
xian[n].leixing=1;
xian[n].C=0;
return 0;
}
int pei(int a,int b)
{
if(a==4)
return 4;
else if(a==3)
return 3;
else if(a==2&&b==9)
return 2;
else
return 1;
}
int cmp1(const void *a,const void *b)
{
return(*(int*)b-*(int*)a);
}
int main()
{
int haiyou[14];
for(int i=1;i<14;i++)
haiyou[i]=4;
char puke[5];
int n;
scanf("%d",&n);
scanf("%s",puke);
for(int i=0;i<4;i++)
{
if(puke[i]=='A')
{
xian[99].pai[i]=1;
haiyou[1]--;
}
else if(puke[i]>='2'&&puke[i]<='9')
{
xian[99].pai[i]=puke[i]-'0';
haiyou[puke[i]-'0']--;
}
else if(puke[i]=='T')
{
xian[99].pai[i]=10;
haiyou[10]--;
}
else if(puke[i]=='J')
{
xian[99].pai[i]=11;
haiyou[11]--;
}
else if(puke[i]=='Q')
{
xian[99].pai[i]=12;
haiyou[12]--;
}
else if(puke[i]=='K')
{
xian[99].pai[i]=13;
haiyou[13]--;
}
}
for(int j=0;j<n;j++)
{
scanf("%s%d",puke,&xian[j].rmb);
for(int i=0;i<5;i++)
{
if(puke[i]=='A')
{
xian[j].pai[i]=1;
haiyou[1]--;
}
else if(puke[i]>='2'&&puke[i]<='9')
{
xian[j].pai[i]=puke[i]-'0';
haiyou[puke[i]-'0']--;
}
else if(puke[i]=='T')
{
xian[j].pai[i]=10;
haiyou[10]--;
}
else if(puke[i]=='J')
{
xian[j].pai[i]=11;
haiyou[11]--;
}
else if(puke[i]=='Q')
{
xian[j].pai[i]=12;
haiyou[12]--;
}
else if(puke[i]=='K')
{
xian[j].pai[i]=13;
haiyou[13]--;
}
}
panduan(j);
}
int zhuangleixing=0,zhuangC=0,change=0;
for(int i=1;i<14;i++)
{
if(haiyou[i]<=0)
continue;
xian[99].pai[4]=i;
panduan(99);
if(zhuangleixing<xian[99].leixing)
{
zhuangleixing=xian[99].leixing;
zhuangC=xian[99].C;
change=i;
}
else if(zhuangleixing==xian[99].leixing)
{
if(zhuangC<=xian[99].C)
{
zhuangC=xian[99].C;
change=i;
}
}
}
xian[99].pai[4]=change;
for(int i=0;i<n;i++)
{
for(int j=0;j<5;j++)
if(xian[i].pai[j]==1)
xian[i].pai[j]=100;
qsort(xian[i].pai,5,sizeof(int),cmp1);
}
for(int j=0;j<5;j++)
if(xian[99].pai[j]==1)
xian[99].pai[j]=100;
qsort(xian[99].pai,5,sizeof(int),cmp1);
int win=0;
int is=0;
for(int i=0;i<n;i++)
{
if(zhuangleixing>xian[i].leixing)
{
is=1;
}
else if(zhuangleixing<xian[i].leixing)
{
is=0;
}
else if(zhuangleixing==xian[i].leixing)
{
if(zhuangC>xian[i].C)
{
is=1;
}
else if(zhuangC<xian[i].C)
{
is=0;
}
else if(zhuangC==xian[i].C)
{
is=1;
for(int z=0;z<5;z++)
{
if(xian[99].pai[z]!=xian[i].pai[z])
{
if(xian[99].pai[z]<xian[i].pai[z])
is=0;
break;
}
}
}
}
if(is)
win+=xian[i].rmb*pei(zhuangleixing,zhuangC);
else
win-=xian[i].rmb*pei(xian[i].leixing,xian[i].C);
}
if(win>0)
printf("%d",win);
else
printf("impossible");
}