超市里的货物架调整
问题描述
在一个超市里,有一个包含 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。
输入变量说明
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
解题思路
我们可以任意顺序排列那么我们可以轻易的得到一个最优解的贪心策略。
-
统计商品数量:首先,我们需要统计货物架上每种商品的数量。使用一个
map来记录每种商品的出现次数。 -
计算最大销售量:遍历顾客想要购买的商品种类,检查每种商品是否在货物架上。如果存在,则增加销售量,并减少该商品在
map中的数量。 -
返回结果:最终返回销售量的总和。
代码实现
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
int solution(int n, int m, string s, string c) {
map<char, int> mp;
for (int i = 0; i < s.size(); i++) {
mp[s[i]]++;
}
int ans = 0;
for (int i = 0; i < c.size(); i++) {
if (mp[c[i]] == 0) {
continue;
} else {
ans++;
mp[c[i]]--;
}
}
return ans;
}
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;
}