1 条题解

  • 0
    @ 2025-4-8 20:54:26

    题意分析

    题目描述了一个简单的扑克游戏评分系统。给定一手55张牌,我们需要根据特定的规则计算这手牌的得分。牌的等级和花色都有明确的定义,且每种牌型对应不同的分数。需要注意的是,如果一手牌同时满足多个规则,只应用得分最高的那个规则。

    输入

    • 第一行是手牌的数量www100w \leq 100)。
    • 接下来的ww行,每行代表一手牌,每手牌由55张牌组成,每张牌由两个大写字母表示(花色++等级),两张牌之间用空格隔开。

    输出

    • 对于每手牌,输出其得分,每行一个结果。

    牌型和得分

    1. 同花顺10001000分(五张同一花色的连续牌,AKQJX视为连续)。
    2. 四条750750分(四张相同等级的牌加一张杂牌)。
    3. 葫芦500500分(三张相同等级的牌加两张另一等级的牌)。
    4. 同花350350分(五张同一花色的牌)。
    5. 顺子250250分(五张连续的牌,AKQJXAKQJX视为连续)。
    6. 三条200200分(三张相同等级的牌加两张不同等级的杂牌)。
    7. 两对100100分(两对相同等级的牌加一张杂牌)。
    8. 一对5050分(两张相同等级的牌加三张不同等级的杂牌)。
    9. 无任何牌型00分。

    标程

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <queue>
    #include <stack>
     
    #define INT_INF 0x3fffffff
    #define LL_INF 0x3fffffffffffffff
    #define EPS 1e-12
    #define MOD 1000000007
    #define PI 3.141592653579798
    #define N 300
     
    using namespace std;
     
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef double DB;
     
    struct data
    {
        char s[2];
    } card[6];
     
    bool cmp(data a,data b)
    {
        if(a.s[1]==b.s[1]) return a.s[0]<b.s[0];
        else return a.s[1]<b.s[1];
    }
     
    int cal()
    {
        int fg1=1 , fg2=1;
        for(int i=1;i<=4;i++)
            if(card[i].s[0]!=card[i+1].s[0])
            {
                fg1=0;
                break;
            }
        for(int i=1;i<=4;i++)
            if(card[i].s[1]!=card[i+1].s[1]-1)
            {
                fg2=0;
                break;
            }
        if(card[1].s[1]==1 && card[2].s[1]==10 && card[3].s[1]==11 && card[4].s[1]==12 && card[5].s[1]==13) fg2=1;
     
        if(fg1 && fg2) return 1000;
     
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 750;
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 750;
     
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 500;
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 500;
     
        if(fg1) return 350;
     
        if(fg2) return 250;
     
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 200;
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 200;
     
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 100;
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 100;
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 100;
     
        if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50;
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50;
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50;
        if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 50;
     
        return 0;
    }
     
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int ca=1;ca<=n;ca++)
        {
            for(int i=1;i<=5;i++)
            {
                scanf("%s",&card[i].s);
                if(card[i].s[1]>='0' && card[i].s[1]<='9') card[i].s[1]=card[i].s[1]-'0';
     
                if(card[i].s[1]=='A') card[i].s[1]=1;
                if(card[i].s[1]=='X') card[i].s[1]=10;
                if(card[i].s[1]=='J') card[i].s[1]=11;
                if(card[i].s[1]=='Q') card[i].s[1]=12;
                if(card[i].s[1]=='K') card[i].s[1]=13;
     
            }
            sort(card+1,card+1+5,cmp);
            printf("%d\n",cal());
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1694
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者