• 炸金花【大模拟】


    大模拟 炸金花(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<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cctype>
    #define ll long long
    #define R register
    #define debug cout<<"fuck"<<endl
    using namespace std;
    template<typename T>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.col<b.col;
    		return a.x>b.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].x<xy[i].x)return 0;
    	}
    	return 2;
    }
    inline int cmp_col(){
    	if(cdy[5].x==1&&xy[5].x==1&&cdy[1].x==13&&cdy[5].col<xy[5].col)return 1;
    	else if(cdy[5].x==1&&xy[5].x==1&&xy[1].x==13&&cdy[5].col>xy[5].col)return 0;
    	for(R int i=1;i<=5;i++){
    		if(cdy[i].col<xy[i].col)return 1;
    		else if(cdy[i].col>xy[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(res1<res2)return 0;
    	return 2;
    }
    inline int cmp2(){
    	int u[10],v[10],l1=0,l2=0;
    	for(R int i=1;i<=5;i++){
    		if(cdy[i].x!=duipai[1][1])u[++l1]=cdy[i].x;
    		if(xy[i].x!=duipai[2][1])v[++l2]=xy[i].x;
    	}
    	for(R int i=1;i<=3;i++){
    		if(u[i]>v[i])return 1;
    		else if(u[i]<v[i])return 0;
    	}
    	return 2;
    }
    int main(){
    	freopen("ptgiving.in","r",stdin);
    	freopen("ptgiving.out","w",stdout);
    	read(T);
    	while(T--){
    		level[1]=level[2]=1;ed[1]=ed[2]=0;
    		for(R int i=1;i<=13;i++)tong[1][i]=tong[2][i]=0;
    		dui[1]=san[1]=si[1]=dui[2]=san[2]=si[2]=0;si[1]=si[2]=0;
    		sanpai[1]=sipai[1]=duipai[1][1]=sanpai[2]=sipai[2]=duipai[1][2]=0;
    		duipai[2][1]=duipai[2][2]=0;jian[1]=jian[2]=0;
    		jian_col[1]=jian_col[2]=0;
    		//上面是预处理 
    		for(R int i=1;i<=5;i++){
    			read(cdy[i].x),read(cdy[i].col),tong[1][cdy[i].x]++;
    			if(cdy[i].x==1)jian[1]=1,jian_col[1]=cdy[i].col;
    		}
    		for(R int i=1;i<=5;i++){
    			read(xy[i].x),read(xy[i].col),tong[2][xy[i].x]++;
    			if(xy[i].x==1)jian[2]=1,jian_col[2]=xy[i].col;
    		}
    		for(R int i=1;i<=13;i++){
    			if(tong[1][i]==2)dui[1]++,duipai[1][dui[1]]=i;
    			if(tong[1][i]==3)san[1]++,sanpai[1]=i;
    			if(tong[1][i]==4)si[1]++,sipai[1]=i;
    			if(tong[2][i]==2)dui[2]++,duipai[2][dui[2]]=i;
    			if(tong[2][i]==3)san[2]++,sanpai[2]=i;
    			if(tong[2][i]==4)si[2]++,sipai[2]=i;
    		}
    		sort(cdy+1,cdy+6);sort(xy+1,xy+6);
    		//同花顺
    		if(tongshun(cdy))level[1]=9,ed[1]=1;
    		if(tongshun(xy))level[2]=9,ed[2]=1;
    		//四条
    		if(!ed[1]&&four(1))level[1]=8,ed[1]=1;
    		if(!ed[2]&&four(2))level[2]=8,ed[2]=1;
    		//满堂红
    		if(!ed[1]&&fullred(1))level[1]=7,ed[1]=1;
    		if(!ed[2]&&fullred(2))level[2]=7,ed[2]=1;
    		//同花
    		if(!ed[1]&&samecol(cdy))level[1]=6,ed[1]=1;
    		if(!ed[2]&&samecol(xy))level[2]=6,ed[2]=1;
    		//顺子
    		if(!ed[1]&&shunzi(cdy))level[1]=5,ed[1]=1;
    		if(!ed[2]&&shunzi(xy))level[2]=5,ed[2]=1;
    		//三条
    		if(!ed[1]&&three(1))level[1]=4,ed[1]=1;
    		if(!ed[2]&&three(2))level[2]=4,ed[2]=1;
    		//两对
    		if(!ed[1]&&dui[1]==2)level[1]=3,ed[1]=1;
    		if(!ed[2]&&dui[2]==2)level[2]=3,ed[2]=1;
    		//一对
    		if(!ed[1]&&dui[1]==1)level[1]=2,ed[1]=1;
    		if(!ed[2]&&dui[2]==1)level[2]=2,ed[2]=1;
    		//先比较牌的形式 
    		if(level[1]>level[2])puts("cdy");
    		else if(level[1]<level[2])puts("xy");
    		//下面是恶心的对比相同形式的牌 
    		else{
    			if(level[1]==9){
    				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()==1)puts("cdy");
    						else puts("xy");
    					}
    				}
    			}
    			else if(level[1]==8){
    				if(sipai[1]==1&&sipai[2]!=1)puts("cdy");
    				else if(sipai[1]!=1&&sipai[2]==1)puts("xy");
    				else{
    					if(sipai[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][2])puts("xy");
    					else{
    						if(duipai[1][1]>duipai[2][1])puts("cdy");
    						else if(duipai[1][1]<duipai[2][1])puts("xy");
    						else{
    							if(jian[1]&&!jian[2])puts("cdy");
    							else if(!jian[1]&&jian[2])puts("xy");
    							else{
    								if(cmp3()==1)puts("cdy");
    								else if(cmp3()==0)puts("xy");
    								else{
    									if(cmp_col()==1)puts("cdy");
    									else puts("xy");
    								}
    							}
    						}
    					}
    				}
    			}
    			else if(level[1]==2){
    				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][1]>duipai[2][1])puts("cdy");
    					else if(duipai[1][1]<duipai[2][1])puts("xy");
    					else {
    						if(jian[1]&&!jian[2])puts("cdy");
    						else if(!jian[1]&&jian[2])puts("xy");
    						else{
    							if(cmp2()==1)puts("cdy");
    							else if(cmp2()==0)puts("xy");
    							else{
    								if(cmp_col()==1)puts("cdy");
    								else puts("xy");
    							}
    						}
    					}
    				}
    			}
    			else{
    				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(jian[1]&&jian[2]){
    							if(jian_col[1]<jian_col[2])puts("cdy");
    							else puts("xy");
    							continue;
    						}
    						if(cmp_col()==1)puts("cdy");
    						else puts("xy");
    					}
    				}
    			}
    		}
    	}
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    ----vue中使用高德地图实现搜索地址----
    ----vue中实现上传文件给后台----
    ----Vue 中mixin 的用法详解----
    ----移动端移动端调试神器vConsole----
    ----微信公众号之实现图片裁剪并上传----
    ----解决input输入框type=number时候去除增减按钮 禁用滚轮事件----
    ----微信公众号之解决二次分享问题----
    ----微信公众号之授权----
    「Linux学习」之clone表达式及grep 用法补充
    「Linux学习」之tar命令用法
  • 原文地址:https://www.cnblogs.com/ZAGER/p/9908380.html
Copyright © 2020-2023  润新知