文件处理
若文件大小是N,则扫描文件的代价是N,扫描后可以缓存。缓存任意文件的代价是M,文件缓存后,后面遇到该文件不需要再扫描,可以直接处理。
输入:
第一行:缓存代价 M
第二行:文件编号 F1 F2 F3...Fn
第三行:文件大小 S1 S2 S3...Sn
输出:
处理完则些文件的最小代价。
核心就是考虑当前文件是否采用缓存。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class File {
int count;
int size;
public File(int count, int size) {
this.count = count;
this.size = size;
}
}
public class Solution1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
String files = in.nextLine();
String sizes = in.nextLine();
Map<String, File> fileMap = new HashMap<>();
String[] filesArr = files.split(" ");
String[] sizesArr = sizes.split(" ");
int sum = 0;
for (int i = 0; i < filesArr.length; i++) {
if (fileMap.containsKey(filesArr[i])) {
File file = fileMap.get(filesArr[i]);
file.count++;
fileMap.put(filesArr[i], file);
} else {
int size = Integer.parseInt(sizesArr[i]);
fileMap.put(filesArr[i], new File(1, size));
}
}
for (Map.Entry<String, File> entry : fileMap.entrySet()) {
File file = entry.getValue();
//使用缓存
if(file.size + n < file.size * file.size) {
sum += file.size + n;
} else {
sum += file.size * file.count;
}
}
System.out.println(sum);
}
}