模拟赛 模拟题

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;
}

原文地址:https://www.cnblogs.com/wangxiaodai/p/9905412.html

时间: 2024-11-07 12:17:31

模拟赛 模拟题的相关文章

某模拟赛C题 树上路径统计 (点分治)

题意 给定一棵有n个节点的无根树,树上的每个点有一个非负整数点权.定义一条路径的价值为路径上的点权和-路径上的点权最大值. 给定参数P,我!=们想知道,有多少不同的树上简单路径,满足它的价值恰好是P的倍数. 注意:单点算作一条路径:u!=v时,(u,v)和(v,u)只算一次. 题解 树上路径统计,解法是点分治.点分的时候求出根到每个点路径最大值和权值和.排一序,然后开个桶,就能计算了.去重就套路的减去没棵子树里面的答案. CODE #include <bits/stdc++.h> using

省选模拟赛某题 图3.29

LINK:图 求出一张图中 生成树森林或基环树+生成树森林的每个方案的贡献之和.n<=16,m<=(n-1)*n/2. 图中只允许最多出现一个环 一个方案的贡献为 这张图的各个联通块大小之积. (爆搜能拿很多分数 因为爆搜的上界并非2^m 类似于一个C(m,n)+C(m,n-1)+C(m,n-2)+...的复杂度. 由于最多只有n条边 且图中最多只有一个环 但是由于边数过多考虑状压点. 当求生成树森林的时候 不难想到f[i]表示i个点的集合生成树的数量. 对于某个集合i来说暴力跑矩阵树定理 最

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设

acm集训训练赛B题【排序+模拟】

一.原题 Description Being a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a bigger array! Your friends agree to give you

一道模拟赛题

一道模拟赛题 简要题意: 树,单点修改,求直径,求必须选\(x\)的最长链,卡空间. 分析: 我们先把必须选的那个丢掉,发现他实际上是单点修改\(inf\)然后查树的直径. 如果不卡空间的话我们可以用点分树来搞一搞,不过由于一次修改会影响到很多点不能用堆来维护只能用支持区间修改的线段树,这样空间就开不下了. 我们还有动态\(DP\). 对一条重链维护\(lx\)表示必须选上端点向下延伸的最长链,\(rx\)表示必须选下端点向上延伸的最长链,\(s\)表示点权和,\(mx\)表示这些点及他们轻儿子

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro