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

96 阅读3分钟

今日再来解析一道题目,题目如下:

image.png

这道题目要求我们在顾客进入超市之前重新排列货架上的商品,以便最大化出售商品数量。

先理解题目

  1. 货架和商品:货架有 n 个格子,每个格子中可能放有一种商品,商品用字母 az 表示。

  2. 顾客的行为:顾客从第一个格子依次查找至第 n 个格子,寻找自己需要的商品,如果找到就购买并离开;如果遇到空格子或者查找完所有格子还没有找到商品,也会离开。

  3. 目标:调整商品的顺序,使得在最优情况下,可以最大化商品的出售数量。

输入的变量为

  • n:货物架的格子数
  • m:顾客想要购买的商品种类数
  • s:货物架上商品的初始顺序
  • c:顾客想要购买的商品种类

思路解析

  1. 需要先统计商品和需求
    • 使用字典 goods 记录货物架上每种商品的数量。
    • 使用字典 wants 记录顾客想要购买的每种商品数量。

主要代码实现

    for i in s: 
        goods[i] = goods.get(i, 0) + 1 
    for i in c: 
        wants[i] = wants.get(i, 0) + 1
  1. 再计算最大出售商品数量
    • 初始化出售商品数 num 为 0。
    • 对于顾客需要的每种商品 k,计算货物架上 k 商品的数量和顾客需要 k 商品的数量的较小值,并累加到 num

主要代码实现

    for j in wants:
        num += min(goods.get(j, 0), wants.get(j, 0))

代码详解

  1. 初始化商品统计
    • 使用字典 goods 统计初始货架上每种商品的数量。
    • 使用字典 wants 统计顾客需要购买的每种商品的数量。
  2. 计算可出售数量
    • 遍历顾客需要的商品种类 wants,计算每种商品在货物架上和顾客需求中的较小值,并累加到总出售商品数量 num 中。

通过几个测试用例来分析一下

让我们来深入分析这三个测试样例,并理解其原理。

样例 1

输入:

  • n = 3
  • m = 4
  • s = "abc"
  • c = "abcd"

输出:3

分析:

  1. 货物架上商品为 "abc"。

  2. 顾客想要购买的商品为 "abcd"。

  3. 使用字典统计商品数量:

    goods = {'a': 1, 'b': 1, 'c': 1}
    wants = {'a': 1, 'b': 1, 'c': 1, 'd': 1}
    
  4. 逐一比较顾客需要的商品和货物架上的商品:

    • 'a' 可以满足,数量为 1。
    • 'b' 可以满足,数量为 1。
    • 'c' 可以满足,数量为 1。
    • 'd' 无法满足,因为货物架上没有 'd'。
  5. 最大可出售商品数量为 min(1, 1) + min(1, 1) + min(1, 1) + min(0, 1) = 3

样例 2

输入:

  • n = 5
  • m = 4
  • s = "bcdea"
  • c = "abcd"

输出:4

分析:

  1. 货物架上商品为 "bcdea"。

  2. 顾客想要购买的商品为 "abcd"。

  3. 使用字典统计商品数量:

    goods = {'b': 1, 'c': 1, 'd': 1, 'e': 1, 'a': 1}
    wants = {'a': 1, 'b': 1, 'c': 1, 'd': 1}
    
  4. 逐一比较顾客需要的商品和货物架上的商品:

    • 'a' 可以满足,数量为 1。
    • 'b' 可以满足,数量为 1。
    • 'c' 可以满足,数量为 1。
    • 'd' 可以满足,数量为 1。
  5. 最大可出售商品数量为 min(1, 1) + min(1, 1) + min(1, 1) + min(1, 1) = 4

通过样例的分析,可以清晰理解如何通过统计和比较顾客需求与货物架上商品的数量来计算最大可出售商品数量。这样,我们可以确保在最优情况下最大化出售商品数量。这道题目考察了对字典和min函数的灵活使用。