青训营X豆包MarsCode 组装电脑 | 豆包MarsCode AI 刷题

99 阅读2分钟

问题描述

小U是一位电脑外壳供应商,而小S是一位电脑零件供应商。他们想要合作组装电脑。小U生产了 n 个电脑外壳,每个外壳的售价是 ai,而小S生产了 n 个电脑零件,每个零件的售价是 bi。当一个外壳与一个零件配对时,电脑的售价是外壳售价与零件售价的和。

他们需要找出一些外壳和零件的配对,使得这些配对形成的电脑售价全部相同,问最多可以组装多少部售价相同的电脑?


测试样例

样例1:

输入:n = 4, a = [1, 2, 3, 4], b = [1, 2, 4, 5] 输出:3

样例2:

输入:n = 3, a = [1, 1, 2], b = [2, 2, 3] 输出:2

样例3:

输入:n = 5, a = [5, 5, 5, 5, 5], b = [1, 2, 3, 4, 5] 输出:1

题目分析:

最开始感觉这个题简单啊,遍历所有可能的组合情况统计每种价格出现的次数,返回最大值即可,使用数据结构:字典 字典的键是组合值的大小,值是组合的数目。最后直接调用函数max(price_dict.values())直接返回即可 代码如下

image.png

初始化字典 price_dict

  • price_dict 用于记录每个 (a[i] + b[j]) 和的出现次数。

  • 键是和的值,值是该和出现的次数。

双重循环遍历 ab

  • 外层循环遍历数组 a,内层循环遍历数组 b

  • 对每一对 (a[i], b[j]),计算它们的和 all = a[i] + b[j]

  • 如果这个和已经在 price_dict 中出现过,则将它的计数值加 1。

  • 如果这个和没有出现过,则在字典中新增该键,值为 1。

返回出现次数最多的和:

price_dict.values() 返回字典中所有和的出现次数。 max(price_dict.values()) 找出最大值,也就是出现次数最多的和的计数。

运行之后发现不对。仔细观察题目样例发现,这里每个每个零件只能使用一次。而不是多次配对。 所以不能够直接统计可能的个数,那么要怎么做???

再次分析题目:

其实是在上一步的基础上做改进

首先还能=是要便利所有可能的组合,这个时候记录的就不是一个和能够出现多少次而是,ij的下标位置。

即字典的key是部件和壳子的求和,value是一个列表,存储了每一种i和j

之后遍历所有可能的求和,使用集合判断i或者j是否之前使用过,从而求出该(部件和壳子的求和)最大配对方式

最后全局返回所有(部件和壳子的求和)配对方式的最大值

代码如下:

image.png

这个题目真是妙啊,比较新颖。