题描述
在一个超市里,有一个包含 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
# 遍历排好序的需求产品列表
for product, quantity in sorted_demand:
# 根据每种产品的需求量进行销售
for _ in range(quantity):
# 检查货架是否还有空位
if shelf_index < n:
sales += 1 # 增加销售计数
shelf_index += 1 # 移动到下一个货架位置
else:
break # 如果货架已满,则停止销售
return sales # 返回总销售量
3
def solution(n: int, m: int, s: str, c: str) -> int:
from collections import Counter
def solution(n: int, m: int, s: str, c: str) -> int: # 统计产品的库存数量 product_count = Counter(s) # 统计客户对不同产品的需求数量 customer_count = Counter(c)
# 计算每种产品的实际需求量,取客户需求和库存数量的较小值
demand = {product: min(customer_count[product], product_count[product]) for product in customer_count}
# 按照需求量从大到小排序,生成一个元组列表
sorted_demand = sorted(demand.items(), key=lambda x: x[1], reverse=True)
sales = 0 # 记录实际销售量
shelf_index = 0 # 当前货架上销售的产品位置索引
# 遍历排好序的需求产品列表
for product, quantity in sorted_demand:
# 根据每种产品的需求量进行销售
for _ in range(quantity):
# 检查货架是否还有空位
if shelf_index < n:
sales += 1 # 增加销售计数
shelf_index += 1 # 移动到下一个货架位置
else:
break # 如果货架已满,则停止销售
return sales # 返回总销售量
### 算法解析
问题理解
我们需要在一个超市的货物架上重新排列商品,以便在顾客到来时能够尽可能多地卖出商品。每个顾客只会购买他们想要的商品中的一种,并且一旦找到就会离开。我们需要计算在最优调整下,最多可以卖出多少件商品。
数据结构选择
- Counter:用于统计货架上每种商品的数量以及顾客对每种商品的需求量。
- 字典:用于存储每种商品的实际需求量(即顾客需求量和库存量的较小值)。
- 列表:用于存储按需求量排序后的商品及其需求量。
算法步骤
-
统计库存和需求:
- 使用
Counter统计货架上每种商品的数量。 - 使用
Counter统计顾客对每种商品的需求量。
- 使用
-
计算实际需求量:
- 对于每种商品,计算其实际需求量,即顾客需求量和库存量的较小值。
-
排序需求:
- 将商品按实际需求量从大到小排序,生成一个元组列表。
-
模拟销售过程:
- 遍历排序后的需求列表,依次销售商品。
- 每销售一件商品,增加销售计数,并移动到下一个货架位置。
- 如果货架已满(即所有格子都已使用),则停止销售。
-
返回结果:
- 返回总销售量。