9. 超市里的货物架调整

175 阅读2分钟

题目

问题描述

在一个超市里,有一个包含 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

题解

读完题目,第一感觉是:一个格子只能放置一个商品,注意是“个”,不是“种”。按照这种思路,一种商品最多只能被卖出去一次,因为对于那一种商品来说,后来的客人总会遇上前一个客人留下的空格子。

image.png

但是按照这个思路,测试样例不就错了么。问旁边的 AI,直接不搭理我,可能问的内容被识别为和编程无关了

想不通直接看答案,这道题的答案写的很简单,就是统计每种货物和客人的数量,取最小值相加。也就是说,如何给商品排序不是这道题的重点,重点是只要商品数量够卖,就一定能按照某种排序卖出去。至于到底怎么排序的,不用我管。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int solution(int n, int m, string s, string c) {
    // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
    // write code here
    int tables[26]={0};
    int tablec[26]={0};

    for(char &ch:s){
        tables[ch-'a']++;
    }

    for(char &ch:c){
        tablec[ch-'a']++;
    }

    int ans=0;
    for(int i=0;i<26;++i){
        ans+=min(tables[i],tablec[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;
}

最后结合答案,一定是我的想象出了问题。实际情况是,货架一个格子可以放多个商品,只要是同一种就行了。

image.png

看看这十来行的代码量,不由得思考,这也能叫中等题?