青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

127 阅读5分钟

超市里的货物架调整

问题描述

在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:

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

测试样例

样例1:

输入:n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3

样例2:

输入:n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2

样例3:

输入:n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4

要解决这个问题,我们的目标是在最优的商品排列下,尽可能多地出售商品。为了达到这个目标,首先要理解题目中顾客寻找商品的过程和超市管理员重新排列商品的策略。

问题分析

  1. 货物架上的商品顺序 s 是给定的,管理员只能在顾客进入之前重新调整这个顺序,但是一旦顾客开始查找商品,顺序就不能再改变。
  2. 顾客要购买的商品种类 c 表示顾客想要购买的商品,顾客会依次从头到尾查找他们想要的商品,并且会在找到第一个商品后离开。如果商品被找到,就会被“出售”,否则顾客什么也买不着。

解决思路

  1. 理想状态:为了让顾客买到最多商品,我们需要尽量让顾客顺利找到他们想要的商品。
  2. 优化商品顺序:我们可以通过将超市货架上的商品排序,使其更符合顾客的需求,即将顾客想买的商品尽量靠前。
  3. 模拟顾客查找商品的过程:顾客依次从头到尾查找商品,并且遇到商品就买下,不遇到就放弃。

步骤:

  1. 统计商品的数量:首先统计 sc 中每个商品的数量。
  2. 最大化商品销售:通过将 c 中出现频率较高的商品尽量放在 s 的前面,来提高商品被购买的机会。
  3. 模拟顾客的购买过程:根据最优排列后的商品顺序,模拟顾客依次购买商品,统计最大销售数量。

代码实现

pythonCopy Code
from collections import Counter

def max_sold_items(n, m, s, c):
    # 统计货物架上每个商品的数量
    shelf_count = Counter(s)
    
    # 统计顾客想要购买的商品的数量
    customer_count = Counter(c)
    
    # 初始化一个变量记录最大可以卖出的商品数量
    sold_count = 0
    
    # 遍历顾客想要购买的商品种类
    for item in customer_count:
        # 如果货架上有这种商品,且顾客想要的数量大于0
        if item in shelf_count:
            # 卖出的商品数量是货架上该商品的数量和顾客想要的数量的最小值
            sold_count += min(shelf_count[item], customer_count[item])
    
    return sold_count

# 测试样例
print(max_sold_items(3, 4, "abc", "abcd"))  # 输出: 3
print(max_sold_items(4, 2, "abbc", "bb"))   # 输出: 2
print(max_sold_items(5, 4, "bcdea", "abcd"))  # 输出: 4

代码解释

  1. Counter:我们使用 collections.Counter 来统计 sc 中每个商品的出现次数。Counter 会返回一个字典,键为商品类型,值为该商品的数量。
  2. sold_count:初始化为0,用于记录最终能够售出的商品数量。
  3. 遍历顾客商品:我们遍历顾客想要购买的商品 c 中的每一项,检查该商品在货架上的库存,并计算顾客能买到的数量(是库存数量和顾客需求数量的最小值)。
  4. 输出结果:返回最终能够卖出的商品总数。

测试样例

  1. 样例1: 输入:n = 3, m = 4, s = "abc", c = "abcd" 输出:3 解释:顾客想要的商品是 'a', 'b', 'c', 'd',其中货架上有 'a', 'b', 'c' 三个商品,因此最多能卖出3件商品。
  2. 样例2: 输入:n = 4, m = 2, s = "abbc", c = "bb" 输出:2 解释:顾客只想要 'b',货架上有 'b' 两个商品,因此最多能卖出2件 'b'
  3. 样例3: 输入:n = 5, m = 4, s = "bcdea", c = "abcd" 输出:4 解释:顾客想要 'a', 'b', 'c', 'd' 四个商品,货架上有这些商品,因此最多能卖出4件商品。

时间复杂度

  • 时间复杂度:遍历 s 和 c 各一次,每次操作的时间复杂度是 O(n) 和 O(m),因此总时间复杂度为 O(n + m)。
  • 空间复杂度:我们使用了两个计数器,空间复杂度是 O(n + m)。

结论

通过使用 Counter 来统计货架和顾客的商品需求,能够有效地计算出最优商品顺序下最多能销售的商品数量。