寻找最大葫芦解题思路|豆包MarsCode AI刷题

231 阅读3分钟

在经典的德州扑克中,“葫芦”是一种强牌型,由三张相同牌面值的牌和两张相同牌面值的牌组成。根据题目的要求,我们需要在给定的牌中找到一个合法的“葫芦”组合,且五张牌的总面值不超过一个给定的最大值 max。为了解决这个问题,我们首先需要将牌面(如 A、2、3、4、...、K)映射到相应的数值,A 的值为 1,K 为 13,其他依次类推。接着,我们可以使用 Counter 来统计每种牌面值的数量,这样就能方便地找到能够形成“葫芦”的组合。具体操作时,我们从可能的三张相同的牌(记作 a)开始遍历,检验该牌值是否有三张或以上,如果有,再找具有两张相同的牌(记作 b),确保 a 和 b 的值不同,再检查这五张牌的总值是否不超过 max。最终,如果找到最大组合,就返回相应的牌值;否则返回“0, 0”。下面是我的解题代码,展示了如何实现上述思路:

#include <bits/stdc++.h>

using namespace std;

vector<int> solution(int n, int max, const vector<int>& array) {
    map<int , int> p;
    for(auto t : array)
        if(t == 1) p[14] ++;
        else p[t] ++;

    vector<int> a , b;
    for(auto [k , v] : p)
        if(v >= 3) a.push_back(k) , b.push_back(k);
        else if(v >= 2) b.push_back(k);

    sort(a.begin() , a.end() , greater<int>());
    sort(b.begin() , b.end() , greater<int>());

    for(auto ta : a)
        for(auto tb : b)
            if(ta != tb)
            {
                if(ta == 14) ta = 1;
                if(tb == 14) tb = 1;
                int sum = ta * 3 + tb * 2;
                if(sum <= max)
                    return {ta , tb};
            }

    return {0, 0};
}

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

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

    vector<int> result3 = solution(9, 40, {1, 11, 13, 12, 7, 8, 11, 5, 6});
    cout << (result3 == vector<int>{0, 0}) << endl;

    return 0;
}


在实际刷题过程中,我学到了使用数据结构(如计数器)来简化统计和访问特定数据的操作。这在处理类似问题时尤为有效,能够减少枚举和判断的复杂度。同时,我理解了处理逻辑顺序的重要性,优先处理更具约束性的条件(如数量和总值限制)能够更快速地找到有效解。结合豆包MarsCode AI 刷题功能,我总结了一些高效学习的方法,比如制定清晰的学习目标,如每天刷多少道题,逐步提升难度,确保打下坚实基础。此外,针对错题进行深度分析,搞清楚出错原因并记录,定期复习错题可以帮助避免犯同样的错误。建议初学者从简单题目开始,建立自信,再逐步过渡到中等和困难的题目,以确保学习过程的连贯性和可持续性。同时,灵活使用学习资源,如结合在线讨论社区与知识面广的同学交流解题思路,使用在线教育平台的课程巩固基础知识,这样在刷题时能有更好的思维框架,提升综合学习效果。