超市里的货物架调整 | 豆包MarsCode AI 刷题

59 阅读4分钟

寻找最大葫芦

这道题目涉及从给定的牌组中找到一种特殊的“葫芦”组合,这种组合由三张相同的牌和两张相同的牌组成,并且五张牌的牌面值之和不能超过指定的最大值 max。在满足条件的组合中,我们还要选择值最大的组合。如果出现相同牌值的情况,则优先选择三张相同的牌更大的组合,若三张相同的牌也相同则比较两张相同的牌的大小。

解题的步骤可以分为以下几个阶段:

  1. 统计牌的数量:使用一个字典或 Counter 来统计每张牌的数量。这样可以方便地识别可能组成三张和两张相同牌的候选组合。
  2. 找到符合“葫芦”条件的组合:遍历牌的统计结果,寻找至少有三张相同和至少有两张相同的牌。对于符合条件的每一对三张牌和两张牌,检查它们的总和是否小于或等于 max
  3. 比较并选择最大组合:对于满足和条件的所有组合,选择三张相同的牌面值较大者,如果相同再选择两张相同的牌面值较大者。
  4. 返回结果:最终输出最佳组合的三张牌和两张牌的值。 `from collections import Counter

def solution(n, max_val, array): # 统计牌的数量 counter = Counter(array)

# 过滤出三张和两张相同的牌的候选组合
three_of_a_kind = []
pair = []

for card, count in counter.items():
    if count >= 3:
        three_of_a_kind.append(card)
    if count >= 2:
        pair.append(card)

# 按照降序排列牌,以便优先选择最大的组合
three_of_a_kind.sort(reverse=True)
pair.sort(reverse=True)

best_combo = (0, 0)

# 尝试不同的“葫芦”组合
for t in three_of_a_kind:
    for p in pair:
        # 确保三张和两张不是同一张牌
        if t != p:
            # 计算总和
            total_value = t * 3 + p * 2
            # 检查是否符合最大值条件
            if total_value <= max_val:
                # 更新最佳组合
                if best_combo == (0, 0) or (t, p) > best_combo:
                    best_combo = (t, p)
                    
return list(best_combo)

测试用例

if name == "main": print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5]) print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9]) print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0]) `

测试用例没有出现什么问题,但是提交时出现了问题,后续对代码进行调整还是有一些问题,希望之后可以重新梳理结果做出正确的答案。

超市里的货物架调整

关键点:
  1. 货架和顾客的行为

    • 顾客从第一个格子开始查找商品,一旦遇到空格子或者查找完所有商品还未找到,顾客就会停止。
    • 顾客只会从货架上购买他们所需的商品。如果他们在货架上找到该商品,就会立刻购买并离开。
  2. 优化目标

    • 超市管理员的任务是通过优化商品的顺序,让尽可能多的顾客能够购买商品。
    • 商品位置一旦确定,就不能再调整,因此管理员要在顾客到来之前对货架上的商品顺序进行最优排列。
    • 顾客会依次检查货架上的商品,从第一个格子开始,到最后一个格子停止,寻找他们需要的商品。
  3. 如何最大化销售

    • 顾客只会按照顺序寻找他们所需要的商品。因此,我们需要考虑如何安排货架上的商品顺序,使得顾客能够尽可能顺利地找到他们需要的商品。
    • 由于每个顾客只会购买一次商品,我们可以通过将顾客想要的商品提前安排到货架上来提高顾客购买的机会。
解题步骤:
  1. 统计顾客需求:首先要知道每个顾客需要哪些商品。可以通过将顾客需求字符串 c 转化为一个集合或列表来记录顾客每个商品的需求。

  2. 贪心策略:为了最大化销售,我们希望顾客想要的商品尽可能靠前。这样,当一个顾客进入时,能够尽早找到所需商品,并购买它。这意味着我们应尽量将顾客需求的商品放置在货架的前面部分。

  3. 排列优化:一种直观的优化方式是:

    • 将顾客需要的商品排到前面,并且按顾客需求的优先级安排顺序。
    • 其他不在顾客需求列表中的商品可以放在后面,不影响顾客的购买顺序。
  4. 模拟顾客购买过程

    • 根据优化后的商品顺序,我们可以模拟顾客的购买过程。对于每一个顾客,按照他们的需求依次检查货架上的商品,如果能找到商品,则视为成功销售一件商品,顾客离开;如果未能找到商品,则该顾客不买任何东西。
  5. 终止条件

    • 当货架上的商品依次被顾客买完时,停止检查。