zoukankan      html  css  js  c++  java
  • 模拟赛 模拟题

    1.送分题(ptgiving.cpp/c/pas)

    【问题背景】

    ​ 众所周知, xkj是GH的得意门生,可是 xkj的数学成绩并不是很理想,每次GH在批评完数学限训做的差的人后,总会在后面加上一句,咱们班还有一位做的最差的同学——xkj,你看看你还有对号吗,居然比cdy做得还差!

    xkj当然是不服的啦,当场跟GH van♂硬币。在玩完硬币后,生成了一系列随机的乱七八糟的数字,并把他们整列成科学计数法的形式,并排序成有序的序列,还计算出排序的最小成本之后,终于,从桌堂里掏出了一本古老的小黄书——来自c。的透彻秘籍。这是xkj、c。和cdy在学gxt和lsq做生意时偷偷找到的秘籍,被c。私吞了,今天xkj冒着风险偷了过来,并偷偷地传给了cdy,就去跳瑰丽华尔兹去了。

    【问题描述】

    ​ cdy自从拿到了小黄书之后就兴奋地不得了,三天后终于有时间在站级部且mt不在的时候和xiaoY一起透彻这本小黄书。(然而此时xkj的灵魂已经飘到了食堂)

    ​ 打开一看,这本小黄书里竟然有一个奇怪的游戏。由于这本书是c。珍藏的,太古老了已经破烂不堪了,所以cdy只知道这个游戏是用黑桃、红心、梅花和方片,A到K的52张牌(不包含大猫和小猫)的进行扑克牌游戏。

    ​ 由于这本书已经破烂不堪,中间描述游戏规则的部分已经被扯成ghj1222的头像那样了,cdy只看到了“每个人的手牌上限有5张”这个信息,所以cdy和xy决定每个人发五张牌,并判定谁的手牌比较大。这本小黄书中规定手牌大小判定的信息如下:

    ​ 所有五张牌的组合,按以下顺序,由大到小排行分为不同牌型:

    编号 名称 英文名称 描述 举例
    1 同花顺 Straight Flush 同一花色顺序的牌。 Q♦ J♦ 10♦ 9♦ 8♦
    2 四条 Four of a Kind 有四张同一点数的牌。 10♣ 10♦ 10♥ 10♠ 9♥
    3 满堂红 Full House 三张同一点数的牌,加一对其它点数的牌。 8♣ 8♦ 8♠ K♥ K♠
    4 同花 Flush 五张同一花色的牌。 A♠ K♠ 10♠ 9♠ 8♠
    5 顺子 Straight 五张顺序的牌。 K♦ Q♥ J♠ 10♦ 9♦
    6 三条 Three of a kind 有三张同一点数的牌。 J♣ J♥ J♠ K♦ 9♠
    7 两对 Two Pairs 两张相同点数的牌,加另外两张相同点数的牌。 A♣ A♦ 8♥ 8♠ Q♠
    8 一对 One Pair 两张相同点数的牌。 9♥ 9♠ A♣ J♠ 8♥
    9 无对 Zilch 不能排成以上组合的牌。 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可以看做最小的牌。此时牌型仍为顺子,是顺子里面最小的一个。

    ​ 花色的顺序为:黑桃(♠)>红心(♥)>梅花(♣)>方块(♦)。

    【输入格式】

    ​ 输入文件名为 ptgiving.in。

    输入的第一行包含一个正整数T,表示有T组测试数据。

    接下来有10*T行,每组测试数据包含10行。

    每组数据的前5行每行用两个整数描述一张cdy手上的牌。每行第一个数表示牌的数码(1表示A,11表示J,12表示Q,13表示K),第二个数表示牌的花色(1表示黑桃,2表示红心,3表示梅花,4表示方块)。

    后5行每行用两个整数描述xy手上的牌,格式同上。

    【输出格式】

    ​ 输出文件名为ptgiving.out。

    一共输出T行,对于每组测试数据,输出cdy或者xy,表示谁的牌比较大。

    考场上打了两个多小时的大模拟。

    因为种种失误从100变成40。

    个人认为最主要的是写一个比较优秀的排序。

    这样排完序之后直接按照每一张依次比。

    还有注意顺子的情况需要判断12345这种情况。

    排序的话,要保证牌数多的放在前面。

    然后牌数一样保证权值大的放在前面。

    之后是颜色。

    非常开心,在自己生日的这天衡水下起了雨。

    noip2018加油。

    生日快乐 王小呆

    code:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    const int wx=47;
    
    inline int read(){
    	int sum=0,f=1; char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    	return sum*f;
    }
    
    struct node{
    	int val,col;
    	friend bool operator < (const node & a,const node & b){
    		if(a.val==b.val)return a.col>b.col;
    		return a.val<b.val;
    	}//牌点数小在前,牌花色小在前 
    };
    
    struct Node{
    	int tval[wx];
    	int tcol[wx];
    	node p[wx];
    	int flag;
    }xy,cdy;
    
    int t[wx];
    
    bool Straight_Flush(Node wxd){
    	for(int i=1;i<=4;i++)if(wxd.tcol[i]>0&&wxd.tcol[i]<5)return false;//判断每一种花色要么是0要么是1(同花) 
    	if(wxd.p[1].val==1&&wxd.p[2].val==10&&wxd.p[3].val==11&&wxd.p[4].val==12&&wxd.p[5].val==13)return true; 
    	//差点忘记判这个小东西 
    	for(int i=1;i<=5;i++)
    		if(wxd.p[i].val-wxd.p[1].val!=i-1)return false;//判断每一张牌是否形成等差数列(顺) 
    	return true;
    }
    
    bool Four_of_a_Kind(Node wxd){
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==2||wxd.tval[i]==3)return false;//判断有没有出现牌数为2或3的,因为这是在判4带1
    	//没有的话,好像直接返回还不行,至少有一个4的 避免出现5个1这样的情况
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==4)return true;
    	return false; 
    }
    
    bool Full_House(Node wxd){
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==1||wxd.tval[i]==4)return false;//这是在判3带2啊喂,有1或者4当然是不行了
    	//然后看一看有没有3个的就可以了
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==3)return true;
    	return false; 
    }
    
    bool Flush(Node wxd){
    	for(int i=1;i<=4;i++)if(wxd.tcol[i]==5)return true;//同花:直接判有没有五张同花色的就可以了 
    	return false;
    }
    
    bool Straight(Node wxd){
    	//直接复制上面的挺好 
    	if(wxd.p[1].val==1&&wxd.p[2].val==10&&wxd.p[3].val==11&&wxd.p[4].val==12&&wxd.p[5].val==13)return true; 
    	for(int i=1;i<=5;i++)
    		if(wxd.p[i].val-wxd.p[1].val!=i-1)return false;
    	return true;
    }
    
    bool Three_of_a_kind(Node wxd){
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==3)return true;//3带2的上面已经判过了,所以这里只判3就可以了 
    	return false;
    }
    
    bool Two_Pairs(Node wxd){
    	//直接统计对的个数就行了吧。。
    	int re=0;
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==2)re++;
    	if(re==2)return true;
    	return false; 
    }
    
    bool One_Pair(Node wxd){
    	//同上
    	for(int i=1;i<=13;i++)if(wxd.tval[i]==2)return true;
    	return false; 
    }
    
    int work(Node zmj){
    	if(Straight_Flush(zmj)) return 1;	//同花顺 
    	if(Four_of_a_Kind(zmj)) return 2;
    	if(Full_House(zmj))	    return 3;
    	if(Flush(zmj))		    return 4;
    	if(Straight(zmj))	    return 5;
    	if(Three_of_a_kind(zmj))return 6;
    	if(Two_Pairs(zmj))		return 7;
    	if(One_Pair(zmj))		return 8;
    	return 9;
    }
    
    bool cmp(node a,node b){
    	if(t[a.val]==t[b.val]&&a.val==b.val)return a.col<b.col;
    	if(t[a.val]==t[b.val])return a.val>b.val;
    	return t[a.val]>t[b.val];
    }
    
    
    void bu_huang_1(){
    	if((cdy.p[1].val==1&&cdy.p[2].val==2)||(xy.p[1].val==1&&xy.p[2].val==2)){//有一个是12345这样的 
    		if((cdy.p[1].val==1&&cdy.p[2].val==2))puts("xy");
    		else puts("cdy");
    	}
    	else{
    		for(int i=1;i<=5;i++)if(cdy.p[i].val==1)cdy.p[i].val=14;//先把1转成权值大的14 
    		for(int i=1;i<=5;i++)if(xy.p[i].val==1)xy.p[i].val=14;
    		sort(cdy.p+1,cdy.p+6);
    		sort(xy.p+1,xy.p+6);
    		if(cdy.p[5].val>xy.p[5].val)puts("cdy");//在比较最后一张牌的信息 
    		if(cdy.p[5].val<xy.p[5].val)puts("xy");
    		if(cdy.p[5].val==xy.p[5].val&&cdy.p[5].col<xy.p[5].col)puts("cdy");
    		if(cdy.p[5].val==xy.p[5].val&&cdy.p[5].col>xy.p[5].col)puts("xy");
    	}
    }
    
    void bu_huang(){
    	for(int i=1;i<=5;i++)if(cdy.p[i].val==1)cdy.p[i].val=14;//先把1转成权值大的14 
    	for(int i=1;i<=5;i++)if(xy.p[i].val==1)xy.p[i].val=14;
    	memset(t,0,sizeof t);
    	for(int i=1;i<=5;i++)t[cdy.p[i].val]++;
    	sort(cdy.p+1,cdy.p+6,cmp);
    	memset(t,0,sizeof t);
    	for(int i=1;i<=5;i++)t[xy.p[i].val]++;
    	sort(xy.p+1,xy.p+6,cmp);
    	for(int i=1;i<=5;i++){
    		if(cdy.p[i].val>xy.p[i].val){puts("cdy");return ;}
    		if(cdy.p[i].val<xy.p[i].val){puts("xy");return ;}
    	}
    	for(int i=1;i<=5;i++){
    		if(cdy.p[i].col<xy.p[i].col){puts("cdy");return ;}
    		if(cdy.p[i].col>xy.p[i].col){puts("xy");return ;}
    	}
    }
    
    void bu_huang_5(){//这个很难受。。。 
    	if((cdy.p[1].val==1&&cdy.p[2].val==2)||(xy.p[1].val==1&&xy.p[2].val==2)){
    		if((cdy.p[1].val==1&&cdy.p[2].val==2)&&(xy.p[1].val==1&&xy.p[2].val==2)){
    			for(int i=5;i>=1;i--){
    				if(cdy.p[i].col<xy.p[i].col){
    					puts("cdy");return ;
    				}
    				if(cdy.p[i].col>xy.p[i].col){
    					puts("xy");return ;
    				}
    			}
    		}
    		if((cdy.p[1].val==1&&cdy.p[2].val==2))puts("xy");
    		if((xy.p[1].val==1&&xy.p[2].val==2))puts("cdy");
    	}
    	else{
    		for(int i=1;i<=5;i++)if(cdy.p[i].val==1)cdy.p[i].val=14;//先把1转成权值大的14 
    		for(int i=1;i<=5;i++)if(xy.p[i].val==1)xy.p[i].val=14;
    		memset(t,0,sizeof t);
    		for(int i=1;i<=5;i++)t[cdy.p[i].val]++;
    		sort(cdy.p+1,cdy.p+6,cmp);
    		memset(t,0,sizeof t);
    		for(int i=1;i<=5;i++)t[xy.p[i].val]++;
    		sort(xy.p+1,xy.p+6,cmp);
    		for(int i=1;i<=5;i++){
    			if(cdy.p[i].val>xy.p[i].val){puts("cdy");return ;}
    			if(cdy.p[i].val<xy.p[i].val){puts("xy");return ;}
    		}
    		for(int i=1;i<=5;i++){
    			if(cdy.p[i].col<xy.p[i].col){puts("cdy");return ;}
    			if(cdy.p[i].col>xy.p[i].col){puts("xy");return ;}
    		}
    	}
    }
    
    
    void you_dian_huang(){
    	if(cdy.flag==1)bu_huang_1();
    	if(cdy.flag==2)bu_huang();
    	if(cdy.flag==3)bu_huang();
    	if(cdy.flag==4)bu_huang();
    	if(cdy.flag==5)bu_huang_5();
    	if(cdy.flag==6)bu_huang();
    	if(cdy.flag==7)bu_huang();
    	if(cdy.flag==8)bu_huang();
    	if(cdy.flag==9)bu_huang();
    }
    
    void clear(){
    	memset(cdy.tval,0,sizeof cdy.tval);
    	memset(cdy.tcol,0,sizeof cdy.tcol);
    	memset(xy.tval,0,sizeof xy.tval);
    	memset(xy.tcol,0,sizeof xy.tcol);
    	memset(cdy.p,0,sizeof cdy.p);
    	memset(xy.p,0,sizeof xy.p);
    }
    
    int main(){
    	freopen("ptgiving.in","r",stdin);
    	freopen("ptgiving.out","w",stdout);
    	
    	int T=read();
    	while(T--){
    		clear();
    		for(int i=1;i<=5;i++){
    			cdy.p[i].val=read(); cdy.p[i].col=read(); 
    			cdy.tval[ cdy.p[i].val ]++; cdy.tcol[ cdy.p[i].col ]++;
    		}
    		for(int i=1;i<=5;i++){
    			xy.p[i].val=read(); xy.p[i].col=read();
    			xy.tval[ xy.p[i].val ]++; xy.tcol[ xy.p[i].col ]++;
    		}
    		sort(cdy.p+1,cdy.p+6);
    		sort(xy.p+1,xy.p+6);
    		cdy.flag=work(cdy);
    		xy.flag=work(xy);
    		if(cdy.flag==xy.flag)you_dian_huang();
    		else {
    			if(cdy.flag<xy.flag)puts("cdy");
    			else puts("xy");
    		} 
    	}
    	
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    很牛逼的android真机调试,手机、平板、电视都可
    设置TextView文字居中
    设置文本编辑器的按回车时触发的事件
    windows搭建virtualbox虚拟机安装的android环境
    Android EditText不弹出输入法焦点问题的总结
    MAVEN 的常用命令
    PuTTY_0.67.0.0工具链接linux
    CentOS6.8安装
    互亿无线短信验证码
    MYSQL: sql中某一个字段内容为用逗号分割的字符串转换成多条数据
  • 原文地址:https://www.cnblogs.com/wangxiaodai/p/9905412.html
Copyright © 2011-2022 走看看