大模拟 炸金花(ptgiving)
问题背景
众所周知, \(xkj\)是\(GH\)的得意门生,可是 \(xkj\) 的数学成绩并不是很理想,每次\(GH\)在批评完数学限训做的差的人后,总会在后面加上一句,咱们班还有一位做的最差的同学——\(xkj\),你看看你还有对号吗,居然比 \(cdy\) 做得还差!
\(xkj\)当然是不服的啦,当场跟\(GH\) \(van♂\)硬币。在玩完硬币后,生成了一系列随机的乱七八糟的数字,并把他们整列成科学计数法的形式,并排序成有序的序列,还计算出排序的最小成本之后,终于,从桌堂里掏出了一本古老的小黄书——来自\(c。\)的透彻秘籍。这是\(xkj、c。\)和\(cdy\)在学\(gxt\)和\(lsq\)做生意时偷偷找到的秘籍,被\(c。\)私吞了,今天\(xkj\)冒着风险偷了过来,并偷偷地传给了\(cdy\),就去跳瑰丽华尔兹去了。
问题描述
\(cdy\)自从拿到了小黄书之后就兴奋地不得了,三天后终于有时间在站级部且mt不在的时候和xiaoY一起透彻这本小黄书。(然而此时\(xk\)j的灵魂已经飘到了食堂)
打开一看,这本小黄书里竟然有一个奇怪的游戏。由于这本书是c。珍藏的,太古老了已经破烂不堪了,所以cdy只知道这个游戏是用黑桃、红心、梅花和方片,A到K的52张牌(不包含大猫和小猫)的进行扑克牌游戏。
由于这本书已经破烂不堪,中间描述游戏规则的部分已经被扯成ghj1222的头像那样了,cdy只看到了“每个人的手牌上限有5张”这个信息,所以cdy和xy决定每个人发五张牌,并判定谁的手牌比较大。这本小黄书中规定手牌大小判定的信息如下:
所有五张牌的组合,按以下顺序,由大到小排行分为不同牌型:
编号 | 名称 | 英文名称 | 描述 | 举例 |
---|---|---|---|---|
1 | 同花顺 | Straight Flush | 同一花色顺序的牌。 | \(\color{red}{Q♦ J♦ 10♦ 9♦ 8♦}\) |
2 | 四条 | Four of a Kind | 有四张同一点数的牌。 | 10♣ \(\color{red}{10♦ 10♥}\) 10♠ \(\color{red}{9♥}\) |
3 | 满堂红 | Full House | 三张同一点数的牌,加一对其它点数的牌。 | 8♣ \(\color{red}{8♦}\) 8♠ \(\color{red}{K♥}\) K♠ |
4 | 同花 | Flush | 五张同一花色的牌。 | A♠ K♠ 10♠ 9♠ 8♠ |
5 | 顺子 | Straight | 五张顺序的牌。 | \(\color{red}{K♦ Q♥}\) J♠ \(\color{red}{10♦ 9♦}\) |
6 | 三条 | Three of a kind | 有三张同一点数的牌。 | J♣\(\color{red}{ J♥}\) J♠ \(\color{red}{K♦}\) 9♠ |
7 | 两对 | Two Pairs | 两张相同点数的牌,加另外两张相同点数的牌。 | A♣ \(\color{red}{A♦ 8♥}\) 8♠ Q♠ |
8 | 一对 | One Pair | 两张相同点数的牌。 | \(\color{red}{9♥}\) 9♠ A♣ J♠ \(\color{red}{8♥}\) |
9 | 无对 | Zilch | 不能排成以上组合的牌。 | \(\color{red}{A♦ Q♦}\) J♠ 9♣ 8♣ |
备注:和某知名游戏《斗地主》类似的,10 J Q K A可以组成顺子,但是J Q K A 2不能组成。不过和《斗地主》不同的是,A 2 3 4 5和2 3 4 5 6也可以组成顺子。我们认为A 2 3 4 5是顺子中最小的一个,而10 J Q K A是顺子中最大的一个。
比较两组牌的大小时,先按照上述规则比较大小,牌型编号小的牌组大。如果两组牌的牌型编号相同,那么按照牌型内牌的重要程度排序,同等重要程度的按照牌型大小排序,按照顺序比较牌的大小,牌大的牌组大。
对于两组牌的比较,点数优先,花色在后。(先比较所有牌的大小,若全部相同再比较花色。)
点数的顺序为:A>K>Q>J>10>9>8>7>6>5>4>3>2。
注意:当五张手牌为5 4 3 2 A时,A可以看做最小的牌。此时牌型仍为顺子,是顺子里面最小的一个。
花色的顺序为:黑桃(♠)>红心(♥)>梅花(♣)>方块(♦)。
举例说明:
1、\(\color{red}{Q♦ J♦ 10♦ 9♦ 8♦}\) > 8♣ 8♥ 8♠ K♥ K♠ (前者牌型为同花顺,比后者大);
2、9♣ \(\color{red}{9♦}\) 9♠ \(\color{red}{Q♥}\) Q♠ > 8♣ \(\color{red}{8♦}\) 8♠ \(\color{red}{K♥}\) K♠ (两者牌型均为满堂红,比较牌型中三张同一点数的牌9比8大);
3、A♣ \(\color{red}{A♦ 8♥}\) 8♠ Q♠ > A♠\(\color{red}{A♥ 7♥}\) 7♠ K♠ (两者牌型均为两对,且最大的对子相同,此时比较次大的对子,8比7大);
4、A♠ Q♠\(\color{red}{ J♥ 9♥}\) 8♥ > \(\color{red}{A♦ Q♦}\) J♠ 9♣ 8♣ (两者牌型均为无对,所有数码均相同,此时比较最大牌的花色,A♠ > A♦)。
5、4♠ \(\color{red}{4♥ A♦ Q♦ 5♦}\) > 4♣ \(\color{red}{4♦}\) A♠ Q♠ 5♠ (两者牌型均为一对,所有数码均相同,此时对4为牌型里最大的部分,因此比较两个对4中最大的花色,即4♠ > 4♣)
由于级部门口比较危险,而\(cdy\)和\(xy\)在\(van♂\)这个游戏,但他们希望你来判断一下结果。
输入格式
输入的第一行包含一个正整数\(T\),表示有\(T\)组测试数据。
接下来有\(10*T\)行,每组测试数据包含\(10\)行。
每组数据的前\(5\)行每行用两个整数描述一张\(cdy\)手上的牌。每行第一个数表示牌的数码(\(1\)表示\(A\),\(11\)表示\(J\),\(12\)表示\(Q\),\(13\)表示\(K\)),第二个数表示牌的花色(\(1\)表示黑桃,\(2\)表示红心,\(3\)表示梅花,\(4\)表示方块)。
后\(5\)行每行用两个整数描述\(xy\)手上的牌,格式同上。
输出格式
一共输出\(T\)行,对于每组测试数据,输出\(cdy\)或者\(xy\),表示谁的牌比较大。
输入样例1
1
1 3
5 3
4 3
3 3
2 3
6 1
10 4
7 1
8 1
9 2
输出样例1
cdy
样例解释
cdy的手牌构成了同花顺,而xy的手牌仅构成普通顺子,所以cdy的手牌大于xy的。
输入样例2
2
2 4
7 4
12 4
4 4
13 4
6 3
5 2
3 4
4 3
2 1
12 3
11 1
10 3
8 3
9 3
2 1
7 1
6 1
13 1
5 1
输出样例2
cdy
xy
样例解释
第一组数据中\(cdy\)的手牌构成了同花而\(xy\)的手牌仅构成顺子。
第二组数据中\(cdy\)的手牌构成了顺子而\(xy\)的手牌构成了同花。
数据规模与约定
对于20%的数据,保证N=1。
对于另外30%的数据,保证输入的全部牌型都是顺子、同花或同花顺。
对于另外10%的数据,保证输入的全部牌型都是无对。
对于100%的数据,保证N<=100000。
题解
这是我校大佬\(rqj\)出的题(题目来源:Nescafé 24 杯模拟赛)
好久没做大模拟了,快\(NOIP\)了,也应该练练手了。
和\(c。\)\(debug\)了3个小时,才改过。。。。
code:
#include
#include
#include
#include
#include
#define ll long long
#define R register
#define debug cout<<"fuck"<inline void read(T &a){
char c=getchar();T x=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
a=f*x;
}
int T,level[5],ed[5],tong[3][20],san[5],si[5],dui[5];
int sanpai[5],sipai[5],duipai[5][5],jian[5],jian_col[5];
struct node{
int x,col;
friend bool operator < (const node &a,const node &b){
if(a.x==b.x)return a.colb.x;
}
}cdy[10],xy[10];
inline bool tongshun(R node a[]){
R int color=a[1].col;
if(a[5].x==1&&a[1].x==13&&a[2].x==12&&a[3].x==11&&a[4].x==10&&a[2].col==color&&a[3].col==color&&a[4].col==color&&a[5].col==color)return 1;
for(R int i=2;i<=5;i++){
if(a[i].col!=color)return 0;
if(a[i].x-a[i-1].x!=-1)return 0;
}
return 1;
}
inline bool four(R int o){
if(si[o])return 1;
return 0;
}
inline bool fullred(R int o){
if(dui[o]&&san[o])return 1;
return 0;
}
inline bool samecol(R node a[]){
R int color=a[1].col;
for(R int i=2;i<=5;i++)
if(a[i].col!=color)return 0;
return 1;
}
inline bool shunzi(R node a[]){
if(a[5].x==1&&a[1].x==13&&a[2].x==12&&a[3].x==11&&a[4].x==10)return 1;
for(R int i=2;i<=5;i++)
if(a[i].x-a[i-1].x!=-1)return 0;
return 1;
}
inline bool three(R int o){
return san[o];
}
inline int cmp_num(){
for(R int i=1;i<=5;i++){
if(cdy[i].x>xy[i].x)return 1;
else if(cdy[i].xxy[5].col)return 0;
for(R int i=1;i<=5;i++){
if(cdy[i].colxy[i].col)return 0;
}
}
inline int cmp3(){
R int res1=0,res2=0;
for(R int i=1;i<=5;i++){
if(cdy[i].x!=duipai[1][1]&&cdy[i].x!=duipai[1][2])res1=cdy[i].x;
if(xy[i].x!=duipai[2][1]&&xy[i].x!=duipai[2][2])res2=xy[i].x;
}
if(res1>res2)return 1;
else if(res1v[i])return 1;
else if(u[i]level[2])puts("cdy");
else if(level[1]sipai[2])puts("cdy");
else puts("xy");
}
}
else if(level[1]==7){
if(sanpai[1]==1&&sanpai[2]!=1)puts("cdy");
else if(sanpai[1]!=1&&sanpai[2]==1)puts("xy");
else {
if(sanpai[1]>sanpai[2])puts("cdy");
else puts("xy");
}
}
else if(level[1]==6){
if(jian[1]&&!jian[2])puts("cdy");
else if(!jian[1]&&jian[2])puts("xy");
else{
if(cmp_num()==1)puts("cdy");
else if(cmp_num()==0)puts("xy");
else{
if(cmp_col())puts("cdy");
else puts("xy");
}
}
}
else if(level[1]==5){
if(cdy[5].x==1&&cdy[1].x==13&&xy[5].x!=1)puts("cdy");
else if(xy[5].x==1&&xy[1].x==13&&cdy[5].x!=1)puts("xy");
else{
if(cmp_num()==1)puts("cdy");
else if(cmp_num()==0)puts("xy");
else{
if(cmp_col())puts("cdy");
else puts("xy");
}
}
}
else if(level[1]==4){
if(sanpai[1]==1&&sanpai[2]!=1)puts("cdy");
else if(sanpai[1]!=1&&sanpai[2]==1)puts("xy");
else{
if(sanpai[1]>sanpai[2])puts("cdy");
else puts("xy");
}
}
else if(level[1]==3){
if(duipai[1][1]==1&&duipai[2][1]!=1)puts("cdy");
else if(duipai[1][1]!=1&&duipai[2][1]==1)puts("xy");
else{
if(duipai[1][2]>duipai[2][2])puts("cdy");
else if(duipai[1][2]duipai[2][1])puts("cdy");
else if(duipai[1][1]duipai[2][1])puts("cdy");
else if(duipai[1][1]