Contest3117 - 2021级新生个人训练赛第24场_问题 B: 扑克牌游戏

问题 B: 扑克牌游戏

时间限制: 1.000 Sec  内存限制: 128 MB
提交 状态

题目描述

扑克牌有 13 种代表不同点数的牌(不考虑花色),如下图所示,从左到右依次为“A”, “2”,“3”,“4”,……  ,“10”,“J”,“Q”,“K”。 

小华正在玩一个扑克牌的游戏,在这个游戏中,每种点数的牌都有一个分数(不一定 跟点数相同)。现在小华手上已经有 n 张扑克牌,他还可以挑选 m 张扑克牌,使得 n+m 张 扑克牌的总分数最大。我们假定每种点数的扑克牌有无穷多张。 
请编程计算小华在游戏中可以最多获得多少分? 

输入

输入共 3 行。 
第 1 行 13 个整数,依次表示每种点数的牌所代表的分数。 
第 2 行两个整数 n 和 m,表示小华已经有 n 张扑克牌,还可以挑选 m 张扑克牌。 
第 3 行输入表示小华手上已经有的 n 张扑克牌的情况,输入的两张扑克牌信息之间没有 空格分隔。 

输出

输出共1行。 输出一个整数,表示小华在游戏中可以获得的最大分数。注意:小华选牌的方案可能不唯一,但只要总分数最大即可,不需要输出选牌的方案。 

样例输入 Copy

1 3 1 1 1 1 2 3 4 1 3 0 1
3 2
234

样例输出 Copy

13

提示

小华原来手上有 3 张牌,分别为“2”,“3”,“4”,对应的分数之和为 3+1+1=5,他可以 再挑选 2 张扑克牌,都是点数为“9”的扑克牌,这 2 张牌的分数之和为 4+4=8,所以小华的总得分为 13 分。 

50%的测试点输入数据保证小华手上已经有的牌中不会出现“A”、“10”、“J”、“Q”、“K” 这 5 种点数的牌。 
80%的测试点输入数据保证小华手上已经有的牌中不会出现“10”这种点数的牌。 
100%的测试点输入数据保证 1≤n≤100,0≤m≤100,0≤每种点数的牌所代表的分数≤1000。 

 

// 问题 B: 扑克牌游戏
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,m,i,maxp=0,ans;
    char str[300];
    int count[20];
    int score[20];
    
    memset( count,0,sizeof( count ) );

    for( i=1;i<=13;i++ )
    {
        scanf("%d",&score[i]);

        maxp=maxp>score[i]?maxp:score[i];
    }
    scanf("%d%d%s",&n,&m,str);


    for( i=0;str[i];i++ )
    {
        if( str[i]=='1' )
        {
            count[10]++;
            i++;
        }
        else if( str[i]>='2' && str[i]<='9' )
        {
            count[ str[i]-'0' ]++;
        }
        else if( str[i]=='A' ) count[1]++;
        else if( str[i]=='J' ) count[11]++;
        else if( str[i]=='Q' ) count[12]++;
        else if( str[i]=='K' ) count[13]++;
    }

    ans=maxp*m;

    for( i=1;i<=13;i++ )
    {
        ans+=score[i]*count[i];
    }
    printf("%d\n",ans);

    return 0;
}
/*
1 2 3 4 5 6 7 8 9 10 11 12 13
0 0
*/

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/122531077