问题描述
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
问题分析
- 首先,我们需要统计货架上每个商品的出现次数。这可以通过遍历货架上的商品字符串
s来实现。 - 之后,根据顾客的需求顺序
c,优先将顾客最想要的商品放在货架的前面。这可以通过调整商品的顺序来实现。 - 在调整商品顺序后,遍历顾客的需求
c,计算最多可以卖出多少件商品。 - 整体问题不能看出是一个贪心问题,而在中间要遍历商品并且商品对应的大部分都是字符类型所以构建的数组选用了哈希表。
c++代码
这里是代码
#include <bits/stdc++.h>
using namespace std;
int solution(int n, int m, string s, string c){
unordered_map<char, int> a;
for (char i : s) {
a[i]++;
}
int b = 0;
for (char i : c) {
if (a[i] > 0) {
b++;
a[i]--;
}
}
return b;
}
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> a;直接用STL进行构建了哈希表(由于主要是字符,也可以用数组)用于统计每个商品的出现次数for (char i : s) { a[i]++; }根据顾客的需求顺序,优先将顾客最想要的商品放在货架的前面int b = 0; for (char i : c) { if (a[i] > 0) { b++; a[i]--; } }遍历顾客的需求顺序,如果货架上有该商品,则增加销售量,并减少该商品的库存。
总结
- 此题的难点在于贪心策略的选择应该优先将顾客最想要的商品放在货架的前面。理解到这样的代码便不难完成。
- 其次通过这题也可以看出在字符类型的题目中使用STL哈希表构建会更加方便,更利于模拟题目。