最大“葫芦”组合问题 | 豆包MarsCode AI刷题

232 阅读3分钟

问题描述

扑克牌游戏中,“葫芦”是一种由三张相同牌面值和两张相同牌面值组成的组合。在这道题目中,我们需要解决以下问题:

输入

  • 一个整数 n,表示牌的数量;
  • 一个整数 max,表示组合的最大值限制;
  • 一个数组 array,表示扑克牌的面值。

输出

  • 返回一个数组 [a, b],其中 a 是三张牌的牌面值,b 是两张牌的牌面值。如果无法找到符合条件的组合,返回 [0, 0]

示例

示例 1: 输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]
解析
[8, 8, 8][5, 5] 组成“葫芦”,总和为 8×3+5×2=348 \times 3 + 5 \times 2 = 348×3+5×2=34,符合要求。

示例 2: 输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]
解析
[6, 6, 6][9, 9] 组成“葫芦”,总和为 6×3+9×2=366 \times 3 + 9 \times 2 = 366×3+9×2=36,符合要求。

示例 3: 输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]
解析
无法找到符合要求的组合。


解题思路

为了高效解决问题,我们采用以下步骤:

1. 数据统计

使用字典 count 统计每种牌面值的数量,方便后续判断每种牌面值是否可以组成三张牌或两张牌。

2. 排序策略

由于扑克牌中 A 的牌面值最小(通常为 1),但在组合中它的实际牌力最大(类似于 14),我们自定义排序规则,优先处理 A。

3. 查找组合

对排序后的牌面值:

  • 优先查找三张牌的组合
  • 对剩余牌,查找两张牌的组合;
  • 判断组合总和是否符合 max 的限制。

4. 边界条件

  • 如果输入为空数组,直接返回 [0, 0]
  • 如果无法找到符合要求的组合,也返回 [0, 0]

代码实现

def solution(n, max, array):
    # 统计每种牌面值的数量
    count = {}
    for card in array:
        if card in count:
            count[card] += 1
        else:
            count[card] = 1
    
    # 自定义排序函数,将A的牌面值设为最大
    def custom_sort(card):
        if card == 1:  # A的牌面值为1
            return 14  # 将A的排序值设为14
        return card
    
    # 对牌面值进行排序,从大到小
    sorted_cards = sorted(count.keys(), key=custom_sort, reverse=True)
    
    # 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合
    for a in sorted_cards:
        if count[a] >= 3:
            for b in sorted_cards:
                if a != b and count[b] >= 2:
                    # 检查组合的牌面值之和是否不超过 max
                    if (3 * a + 2 * b) <= max:
                        return [a, b]
    
    # 如果没有找到符合条件的组合,返回 [0, 0]
    return [0, 0]

关于 AI 使用的思考

在本题的解题过程中,AI(MarsCode)提供了关键性的帮助,同时也暴露了一些问题:

AI 的优势

  1. 提供了数据统计和排序的基本思路,让我们能够快速构造初步解决方案。
  2. 建议通过自定义排序函数处理特殊牌值(如 A > K > Q)的优先级问题,增加了代码的实用性。

AI 的局限

  1. 泛化但缺少细节:AI 提供的思路多为高层概述,具体实现细节仍需要用户手动补充。
  2. 边界处理不足:AI 没有覆盖到输入为空数组或 max 太小导致无法找到组合的特殊情况。

改进方法

  1. 问题拆解:通过引导 AI 逐步生成代码(如单独询问如何排序或如何构造统计逻辑),可以提升代码的完整性。
  2. 边界补充:人工需要根据业务需求添加对特殊情况的处理逻辑。