AI 刷题 5. 寻找最大的葫芦 题解 | 豆包MarsCode AI刷题

171 阅读3分钟

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a 和另外两张相同牌面值的牌 b。如果两个人同时拥有“葫芦”,我们会优先比较牌 a 的大小,若牌 a 相同则再比较牌 b 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。

问题思路: 我们用结构体实现,设置一个结构体包括4个部分,{a:葫芦牌a的牌面计算值 b:葫芦牌b的牌面计算值 numa:葫芦牌a的牌面比较权重值 numb:葫芦牌b的牌面比较权重值}。
其中numa和numb用于比较葫芦大小用来排序(遵循牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13),而a和b则用于筛选出符合条件的葫芦(组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max)。
排序后选择依次遍历,找到第一个符合条件的就输出,若没有就输出“0,0”,而提取葫芦直接根据数组计算出每个牌面的数量后处理就可以了(这点不过多介绍)

代码实现:

#include <vector>
#include <bits/stdc++.h>
using namespace std;
struct mm{
    int numa;
    int numb;
    int a;
    int b;
};
bool cmp(mm a,mm b){
    if(a.numa==b.numa){
        return a.numb>b.numb;
    }
    return a.numa>b.numa;
}
std::vector<int> solution(int n, int max, const std::vector<int>& array) {
    // Edit your code here
    unordered_map<int,int> map;
    for(int i=0;i<array.size();i++){
        map[array[i]]++;
    }
    vector<int> arr;
    vector<int> brr;
    for (auto it = map.begin(); it != map.end(); ++it) {
        if(it->second>=3){
            arr.push_back(it->first);
        }
        if(it->second>=2){
            brr.push_back(it->first);
        }
    }
    int a,b;
    vector<mm> vrr;
    for(int i=0;i<arr.size();i++)
    {
        for(int j=0;j<brr.size();j++)
        {
            if(arr[i]==brr[j])
            {
                continue;
            }
            mm v;
            v.a=arr[i];
            v.b=brr[j];
            if(arr[i]==1)
            {
                v.numa=14;
            }
            else 
            {
                v.numa=arr[i];
            }
            if(brr[j]==1)
            {
                v.numb=14;
            }
            else 
            {
                v.numb=brr[j];
            }
            vrr.push_back(v);
        }
    }
    sort(vrr.begin(),vrr.end(),cmp);
    int cnt=0;
    for(int i=0;i<vrr.size();i++)
    {
      //  cout<<vrr[i].a<<" "<<vrr[i].b<<endl;
       if(vrr[i].a*3+vrr[i].b*2<=max)
        {
            cnt=1;
            a=vrr[i].a;
            b=vrr[i].b;
            break;
        }
    }
  //  cout<<a<<" "<<b<<endl;
    if(!cnt){
        return {0, 0};
    }
    return {a, b};
}

int main() {
    // Add your test cases here
    
    std::vector<int> result1 = solution(9, 34, {6, 6, 6, 8, 8, 8, 5, 5, 1});
    std::cout << (result1 == std::vector<int>{8, 5}) << std::endl;

    std::vector<int> result2 = solution(9, 37, {9, 9, 9, 9, 6, 6, 6, 6, 13});
    std::cout << (result2 == std::vector<int>{6, 9}) << std::endl;

     std::vector<int> result3 = solution(9, 40, {1, 11, 13, 12, 7, 8, 11, 5, 6});
    std::cout << (result3 == std::vector<int>{0, 0}) << std::endl;
    std::vector<int> result4 = solution(31, 42, {3,3,11,12,12,2,13,5,13,1,13,8,8,1,8,13,12,9,2,11,3,5,8,11,1,11,1,5,4,2,5});
    std::cout << (result4 == std::vector<int>{1, 13}) << std::endl;

    return 0;
}