超市里的货物架调整
题目类型
思维题,贪心题,模拟题
题意
- 在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。
- 当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
- 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
- n:货物架的格子数
- m:顾客想要购买的商品种类数
- s:货物架上商品的初始顺序
- c:顾客想要购买的商品种类
题解
题目分析
- 对于这个题目,有一个比较特殊的点是用户看到空的格子也会离开,那么就可能导致货物本来是有用户需要的商品的,但是因为前面的商品被前面的用户拿走后导致该位置空闲出来,这样就会到这个用户拿不到商品,导致无法最大化结果。
- 为了实现最大化,可以采用贪心的方案,也就是最早购买的用户需要的商品,放在货物架的最后,这样可以保证不会有上面提到的“货物本来是有用户需要的商品的,但是因为前面的商品被前面的用户拿走后导致该位置空闲出来,这样就会到这个用户拿不到商品”的情况,贪心地进行判断。
- 所以就是题目给定了两个字符串s1和s2,需要在s1中寻找多少个在s2中出现过的字符,注意s1和s2的每个字符都只能用一次,所以需要维护每个字符出现的次数,可以采用数组统计,为了方便我采用了stl中的map进行统计,在扫描s2的时候增加计数,在扫描s1的时候减少计数,从而维护最大值。
数据结构选择
- 商品频率统计:我们可以使用一个哈希表(如
std::map或std::unordered_map)来统计每个商品在顾客需求中的出现频率。 - 商品顺序调整:为了最大化销售量,我们可以根据商品的频率来调整货架上商品的顺序。
算法步骤
- 统计顾客需求中每个商品的频率:遍历顾客需求字符串
c,统计每个商品的出现次数。 - 根据频率调整货架顺序:将货架上的商品按照顾客需求中的频率从高到低进行排序。
- 计算最大销售量:遍历调整后的货架,统计能够满足的顾客需求数量。
代码实现
#include <iostream>
#include <string>
#include <map>
int solution(int n, int m, std::string s, std::string c) {
std::map<int, int> mp;
for(auto x : c) {
mp[x]++;
}
int res = 0;
for(auto x : s) {
if(mp[x]) res++, mp[x]--;
}
return res;
}