通过率 60% · 提交 410 · 通过 246
小慕正在开发一个代码质量检测工具,该工具通过静态扫描来快速识别源代码中的缺陷。扫描结果以报告形式输出。扫描过程中涉及以下规则: 1. 扫描一个文件的成本与文件大小有关:若文件大小为 N,则。 2. 扫描报告的缓存成本与文件大小无关:每缓存一份报告需要花费 M 个金币。 3. 一旦某份报告被缓存,后续再次遇到该文件时,无需再次扫描,可直接获取缓存结果。 现在小慕拿到了一组源代码文件的标识序列和对应的文件大小序列,请你帮助他设计合理的,计算出完成所有文件扫描所需的最少金币数。
这类题属于华为 OD 机考真题方向中「100分 / 2024E」方向的高频题型,通常考察对「100分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为缓存一个报告金币数M,1 <= M <= 100 第二行为文件标识序列:F1,F2,F3,…,Fn。 第三行为文件大小序列:S1,S2,S3,…,Sn。
采用合理的缓存策略,需要的最少金币数
示例 1
输入示例
5 1 2 2 1 2 3 4 1 1 1 1 1 1 1
输出示例
7
文件大小相同,扫描成本均为1个金币。缓存任意文件均不合算,因而最少成本为7金币。
示例 2
输入示例
5 2 2 2 2 2 5 2 2 2 3 3 3 3 3 1 3 3 3
输出示例
9
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
出题人又不做人了,题目非常费解,需要结合示例和说明仔细理解。
首先我们需要理解金币会花在什么地方。主要是两个方面:
file 的时候,如果对它进行扫描,会花费 N 个金币。缓存的好处是什么呢? 缓存的好处在于下次再次遇到这个同一个文件 file 的时候,不需要重新扫描花费金币了,可以直接获得其内容。
因此,对于示例二而言:
虽然题目没有给出具体的用例说明,但我们也应该得看懂其含义。 大小为 3 的文件 2 在例子中多次出现了,我们在第一次扫描的时候花费了 3 金币,并且进行缓存花费了 5 金币,之后多次遇到同一个文件 2 都不需要再额外花费金币来扫描了。 文件 5 只出现了一次,因此直接扫描花费 1 金币,不缓存。 一共花费 3 + 5 + 1 = 9 个金币即为答案。
在读懂题意之后,本题的贪心策略其实非常容易想到。 核心的抉择点在于某一个文件在第一次遇到的时候是否要进行缓存。
如果要进行缓存,显然是在第一次遇到的时候就缓存是最划算的,而不是在第二次、第三次遇到的时候才缓存。
由于我们“开了天眼”,知道某一个文件 file 在后续数组中会出现的次数,我们设为 cnt_file。 假设其文件大小(直接扫描所花费的金币数)为 N,如果:
file 所需要花费的金币即为 N * cnt_file(扫描 cnt_file 次,每次花 N 金币)。file 所需要花费的金币即为 N + M(扫描 1 次花费 N 金币,缓存 1 次花费 M 金币)。所以,为了使得对这个 file 的总花费金币更少,我们只需要取上述两个数值之间的较小值即可。 这个过程可以非常方便地使用哈希表来完成。
复杂度分析 设 n 为文件标识序列的长度(即需要处理的文件请求总数),k 为其中互不相同的文件个数(k <= n)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有