文件处理

发布时间 2023-03-22 21:11:49作者: 初寒~修

若文件大小是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);

    }
}