问题描述
在一个超市里,有一个包含 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
题目理解
题目表述的不太清楚,经过我的测试发现,题意应该是同种商品可以放在一个格子里(所以n个商品其实用不了n个格子?)。并且只要求计算在最优调整下,最多可以卖出多少件商品,并没有要求给出最优调整是什么。
字符串c中的每一个字符都代表一个顾客想要的商品,顾客会查找货架寻找自己想要购买的商品,遇到空格子就会离开,所以在顾客想要的商品还没卖完时我们要避免顾客遇到空格子。
题目思路
最优的解法就是把同种商品放一个格子里,并且根据顾客来的顺序,把最先卖完的商品放在后面,例如 输入:n = 7, m = 5, s = "aabbccd", c = "abccbad"。可以看出,商品卖完的顺序是 cbad ,所以最优的解法就是把 d 全部放在第一个格子,把 a 全部放在第二个格子,把 b 全部放在第三个格子,把 c 全部放在第四一个格子。这样就保证了如果一个商品没有卖完,那么它的前面不会有空格子,如果顾客遇到空格子,说明想要的商品已经卖完了。
代码实现
但实际上,我们只是知道最优解法是什么就好了,不需要在代码中体现出来。在最优解法下,可以实现卖出商品最大化,就是只要商品还没卖完并且有顾客想买就一定能卖出去,所以每种商品卖出的数量就是存货量和顾客需求量的最小值。代码如下:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int solution(int n, int m, string s, string c) {
int alpha_s[26] = {0};
int alpha_c[26] = {0};
for(auto e : s)
alpha_s[e - 'a']++;
for(auto e : c)
alpha_c[e - 'a']++;
int count = 0;
for(int i = 0; i < 26; i++) {
count += min(alpha_s[i], alpha_c[i]);
}
return count;
}
只需要统计每种商品的存货量和需求量,然后各取最小值求和即可。