题目描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
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
解题思路
问题理解
这个问题可以看作是一个资源分配问题。我们需要在顾客到来之前,通过重新排列货架上的商品,使得在第一个顾客到来时,能够尽可能多地满足他们的需求。每个顾客只会购买他们想要的商品中的一种,并且一旦找到就会离开。因此,我们的目标是在最优排列下,最大化顾客的购买数量。
数据结构选择
为了有效地解决这个问题,我们需要使用以下数据结构:
- 商品频率统计:我们需要统计每个商品在货架上的出现次数。这可以通过一个哈希表(或数组)来实现,键为商品种类,值为该商品的出现次数。
- 顾客需求统计:同样,我们需要统计每个顾客想要购买的商品种类及其数量。这也可以通过一个哈希表来实现。
算法步骤
- 统计商品频率:遍历货架上的商品,统计每个商品的出现次数。
- 统计顾客需求:遍历顾客想要的商品种类,统计每个商品的需求数量。
- 计算最大销售量:根据商品频率和顾客需求,计算在最优排列下,最多可以卖出多少件商品。
详细步骤
- 统计商品频率:
- 使用一个
unordered_map<char, int>来存储每个商品的出现次数。 - 遍历货架上的商品字符串
s,对于每个商品,将其出现次数加一。
- 使用一个
- 统计顾客需求:
- 使用另一个
unordered_map<char, int>来存储每个顾客想要的商品种类及其数量。 - 遍历顾客需求的字符串
c,对于每个商品,将其需求数量加一。
- 使用另一个
- 计算最大销售量:
- 初始化一个变量
maxSales用于记录最大销售量。 - 遍历顾客需求哈希表,对于每个商品,计算其需求数量与货架上该商品数量的最小值,并将其累加到
maxSales中。
- 初始化一个变量
代码实现
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int solution(int n, int m, string s, string c) {
// 统计商品频率
unordered_map<char, int> productCount;
for (char product : s) {
productCount[product]++;
}
// 统计顾客需求
unordered_map<char, int> customerDemand;
for (char demand : c) {
customerDemand[demand]++;
}
// 计算最大销售量
int maxSales = 0;
for (auto& demand : customerDemand) {
char product = demand.first;
int demandCount = demand.second;
if (productCount.find(product) != productCount.end()) {
maxSales += min(productCount[product], demandCount);
}
}
return maxSales;
}
int main() {
cout << (solution(3, 4, "abc", "abcd") == 3) << endl;
cout << (solution(4, 2, "abbc", "bb") == 2) << endl;
cout << (solution(5, 4, "bcdea", "abcd") == 4) << endl;
return 0;
}
代码解释
- 统计商品频率:
unordered_map<char, int> productCount;用于存储每个商品的出现次数。for (char product : s)遍历货架上的商品字符串s,对于每个商品,将其出现次数加一。
- 统计顾客需求:
unordered_map<char, int> customerDemand;用于存储每个顾客想要的商品种类及其数量。for (char demand : c)遍历顾客需求的字符串c,对于每个商品,将其需求数量加一。
- 计算最大销售量:
int maxSales = 0;初始化最大销售量。for (auto& demand : customerDemand)遍历顾客需求哈希表,对于每个商品,计算其需求数量与货架上该商品数量的最小值,并将其累加到maxSales中。
总结
通过上述步骤,我们可以有效地计算出在最优排列下,最多可以卖出多少件商品。这个问题的核心在于统计商品频率和顾客需求,并通过简单的比较和累加操作来计算最大销售量。通过合理选择数据结构和算法,我们可以在较短的时间内解决这个问题。 希望这份题解能帮助你更好地理解这个问题,并在实际编程中应用这些思路。如果你有任何进一步的问题或需要更多的帮助,请随时告诉我!