超市中货物架调整

97 阅读4分钟

题目描述

在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 az 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 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

解题思路

问题理解

这个问题可以看作是一个资源分配问题。我们需要在顾客到来之前,通过重新排列货架上的商品,使得在第一个顾客到来时,能够尽可能多地满足他们的需求。每个顾客只会购买他们想要的商品中的一种,并且一旦找到就会离开。因此,我们的目标是在最优排列下,最大化顾客的购买数量。

数据结构选择

为了有效地解决这个问题,我们需要使用以下数据结构:

  1. 商品频率统计:我们需要统计每个商品在货架上的出现次数。这可以通过一个哈希表(或数组)来实现,键为商品种类,值为该商品的出现次数。
  2. 顾客需求统计:同样,我们需要统计每个顾客想要购买的商品种类及其数量。这也可以通过一个哈希表来实现。

算法步骤

  1. 统计商品频率:遍历货架上的商品,统计每个商品的出现次数。
  2. 统计顾客需求:遍历顾客想要的商品种类,统计每个商品的需求数量。
  3. 计算最大销售量:根据商品频率和顾客需求,计算在最优排列下,最多可以卖出多少件商品。

详细步骤

  1. 统计商品频率
    • 使用一个 unordered_map<char, int> 来存储每个商品的出现次数。
    • 遍历货架上的商品字符串 s,对于每个商品,将其出现次数加一。
  2. 统计顾客需求
    • 使用另一个 unordered_map<char, int> 来存储每个顾客想要的商品种类及其数量。
    • 遍历顾客需求的字符串 c,对于每个商品,将其需求数量加一。
  3. 计算最大销售量
    • 初始化一个变量 maxSales 用于记录最大销售量。
    • 遍历顾客需求哈希表,对于每个商品,计算其需求数量与货架上该商品数量的最小值,并将其累加到 maxSales 中。

代码实现

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int solution(int n, int m, string s, string c) {
    // 统计商品频率
    unordered_map<char, int> productCount;
    for (char product : s) {
        productCount[product]++;
    }
    
    // 统计顾客需求
    unordered_map<char, int> customerDemand;
    for (char demand : c) {
        customerDemand[demand]++;
    }
    
    // 计算最大销售量
    int maxSales = 0;
    for (auto& demand : customerDemand) {
        char product = demand.first;
        int demandCount = demand.second;
        if (productCount.find(product) != productCount.end()) {
            maxSales += min(productCount[product], demandCount);
        }
    }
    
    return maxSales;
}
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;
}

代码解释

  1. 统计商品频率
    • unordered_map<char, int> productCount; 用于存储每个商品的出现次数。
    • for (char product : s) 遍历货架上的商品字符串 s,对于每个商品,将其出现次数加一。
  2. 统计顾客需求
    • unordered_map<char, int> customerDemand; 用于存储每个顾客想要的商品种类及其数量。
    • for (char demand : c) 遍历顾客需求的字符串 c,对于每个商品,将其需求数量加一。
  3. 计算最大销售量
    • int maxSales = 0; 初始化最大销售量。
    • for (auto& demand : customerDemand) 遍历顾客需求哈希表,对于每个商品,计算其需求数量与货架上该商品数量的最小值,并将其累加到 maxSales 中。

总结

通过上述步骤,我们可以有效地计算出在最优排列下,最多可以卖出多少件商品。这个问题的核心在于统计商品频率和顾客需求,并通过简单的比较和累加操作来计算最大销售量。通过合理选择数据结构和算法,我们可以在较短的时间内解决这个问题。 希望这份题解能帮助你更好地理解这个问题,并在实际编程中应用这些思路。如果你有任何进一步的问题或需要更多的帮助,请随时告诉我!