16初出茅庐A题

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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值