AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

P3162. 静态代码扫描服务

中等通过率 60% · 提交 409 · 通过 245
贪心模拟哈希表数学

小慕正在开发一个代码质量检测工具,该工具通过静态扫描来快速识别源代码中的缺陷。扫描结果以报告形式输出。扫描过程中涉及以下规则: 1. 扫描一个文件的成本与文件大小有关:若文件大小为 N,则。 2. 扫描报告的缓存成本与文件大小无关:每缓存一份报告需要花费 M 个金币。 3. 一旦某份报告被缓存,后续再次遇到该文件时,无需再次扫描,可直接获取缓存结果。 现在小慕拿到了一组源代码文件的标识序列和对应的文件大小序列,请你帮助他设计合理的,计算出完成所有文件扫描所需的最少金币数。

提示:带虚线的词点一下有通俗解释。

输入描述

第一行为缓存一个报告金币数M,1 <= M <= 100 第二行为文件标识序列:F1,F2,F3,…,Fn。 第三行为文件大小序列:S1,S2,S3,…,Sn。 - 1 <= N <= 10000 - 1 <= Fi <= 1000 - 1 <= Si <= 10

输出描述

采用合理的缓存策略,需要的最少金币数

示例

示例 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

看不懂题目?点开图解
核心思路:缓存 vs 不缓存示例:M=5, 文件序列: 2,2,2,2,2,5,2,2,2 大小:3,3,3,3,3,1,3,3,3不缓存策略每次遇到文件都扫描总金币 = 所有文件大小之和= 3+3+3+3+3+1+3+3+3 = 25缓存策略(最优)第一次扫描文件2(花3金币)缓存报告(花5金币)后续文件2直接取缓存(0金币)文件5只出现一次,扫描(1金币)总金币 = 3+5+1 = 9比较关键:对出现多次的文件,缓存可能更省;对只出现一次的文件,不缓存。决策:对每个文件,比较“每次扫描”与“第一次扫描+缓存+后续免费”的总花费。公式:若文件出现 k 次,大小 s,缓存成本 M,则不缓存花费 = k * s,缓存花费 = s + M,选较小者。
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「静态代码扫描服务」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。