超市里的货物架调整 | 豆包MarsCode AI 刷题

92 阅读3分钟

超市里的货物架调整

题目类型

思维题,贪心题,模拟题

题意

  • 在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。
  • 当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
  • 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
    • n:货物架的格子数
    • m:顾客想要购买的商品种类数
    • s:货物架上商品的初始顺序
    • c:顾客想要购买的商品种类

题解

题目分析

  • 对于这个题目,有一个比较特殊的点是用户看到空的格子也会离开,那么就可能导致货物本来是有用户需要的商品的,但是因为前面的商品被前面的用户拿走后导致该位置空闲出来,这样就会到这个用户拿不到商品,导致无法最大化结果。
  • 为了实现最大化,可以采用贪心的方案,也就是最早购买的用户需要的商品,放在货物架的最后,这样可以保证不会有上面提到的“货物本来是有用户需要的商品的,但是因为前面的商品被前面的用户拿走后导致该位置空闲出来,这样就会到这个用户拿不到商品”的情况,贪心地进行判断。
  • 所以就是题目给定了两个字符串s1和s2,需要在s1中寻找多少个在s2中出现过的字符,注意s1和s2的每个字符都只能用一次,所以需要维护每个字符出现的次数,可以采用数组统计,为了方便我采用了stl中的map进行统计,在扫描s2的时候增加计数,在扫描s1的时候减少计数,从而维护最大值。

数据结构选择

  1. 商品频率统计:我们可以使用一个哈希表(如 std::map 或 std::unordered_map)来统计每个商品在顾客需求中的出现频率。
  2. 商品顺序调整:为了最大化销售量,我们可以根据商品的频率来调整货架上商品的顺序。

算法步骤

  1. 统计顾客需求中每个商品的频率:遍历顾客需求字符串 c,统计每个商品的出现次数。
  2. 根据频率调整货架顺序:将货架上的商品按照顾客需求中的频率从高到低进行排序。
  3. 计算最大销售量:遍历调整后的货架,统计能够满足的顾客需求数量。

代码实现

#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;
}