华为od机试-缓存需要最少金币数 /静态扫描(java)
静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出:
1、文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币
2、扫描报告的缓存成本和文件大小无关,每缓存一个报告需要M个金币
3、扫描报告缓存后,后继再碰到该文件则不需要扫描成本,直接获取缓存结果给出源代码文件标识序列和文件大小序列,求解采用合理的缓存策略,最少需要的金币数
输入描述
第一行为缓存一个报告金币数M,L<= 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
java代码
package odTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class cacheCoin {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int cacheCost = Integer.parseInt(scanner.nextLine());
int[] inputFileNos = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int[] FileScanCost = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
//key存储文件标识号,int[0]保存扫描价格,int[1]保存同一标识号文件数量
Map<Integer,int[]> map = new HashMap<>();
for(int i=0;i<inputFileNos.length;i++) {
if(map.containsKey(inputFileNos[i])) {
int[] info = map.get(inputFileNos[i]);
info[1] = info[1]+1;
// System.out.println(inputFileNos[i]);
map.put(inputFileNos[i], info);
}else {
int[] info = new int[2];
info[0] = FileScanCost[i];
info[1] = 1;
map.put(inputFileNos[i], info);
}
}
//最合适的花费
int optimCost = 0;
for(Map.Entry<Integer, int[]> entry: map.entrySet()) {
int[] info = entry.getValue();
//当缓存的花费小于扫描的花费,则不用扫描
if( info[0] * info[1] > ( cacheCost + info[0] )) {
optimCost = optimCost + cacheCost + info[0];
}else {//否则用扫描
optimCost = optimCost+ info[0] * info[1];
}
}
System.out.println(optimCost);
}
}