华为od机试-缓存需要最少金币数 /静态扫描(java)

打印 上一主题 下一主题

主题 1749|帖子 1749|积分 5247

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出:
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代码
  1. package odTest;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6. public class cacheCoin {
  7.         public static void main(String[] args) {
  8.                 Scanner scanner = new Scanner(System.in);
  9.                 int cacheCost = Integer.parseInt(scanner.nextLine());
  10.                 int[] inputFileNos = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
  11.                
  12.                 int[] FileScanCost = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
  13.                
  14.                 //key存储文件标识号,int[0]保存扫描价格,int[1]保存同一标识号文件数量
  15.                 Map<Integer,int[]> map = new HashMap<>();
  16.                 for(int i=0;i<inputFileNos.length;i++) {
  17.                         if(map.containsKey(inputFileNos[i])) {
  18.                                 int[] info = map.get(inputFileNos[i]);
  19.                                 info[1] = info[1]+1;
  20. //                                System.out.println(inputFileNos[i]);
  21.                                 map.put(inputFileNos[i], info);
  22.                         }else {
  23.                                 int[] info = new int[2];
  24.                             info[0] = FileScanCost[i];
  25.                             info[1] = 1;
  26.                             map.put(inputFileNos[i], info);
  27.                         }
  28.                 }
  29.                 //最合适的花费
  30.                 int optimCost = 0;
  31.                 for(Map.Entry<Integer, int[]> entry: map.entrySet()) {
  32.                         int[] info = entry.getValue();
  33.                         //当缓存的花费小于扫描的花费,则不用扫描
  34.                         if( info[0] * info[1] > ( cacheCost + info[0] )) {
  35.                                 optimCost = optimCost + cacheCost + info[0];
  36.                         }else {//否则用扫描
  37.                                 optimCost = optimCost+ info[0] * info[1];
  38.                         }
  39.                 }
  40.                 System.out.println(optimCost);
  41.         }
  42. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表