版权声明:本文为CSDN博主「dijk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/IOIO_/article/details/81056963
源程序是dijk写的,鄙人只是添加了一些注释作为学习笔记,旨在大家更好的理解教材
package cn.htu.test; /* * 磁带最优存储 * 至于书上写的给出数据p是概率,但是这本书就是这。。。 * 你懂 就好,不必太死磕书,毕竟此类书国内比较少,作者已经非常呕心沥血了,希望后有好的来者 * p虽然是872,452等等,你可以理解为频数 * 做程序最先要搞懂的就是输入什么,我们要得到什么 * 这个程序的output是最少的平均读取时间,至于存储方案根本就已经题目说过了,不是让我们想的,而是 * 让我们执行的,所以要求平均,就需要有总和和除数,本题的关键就是求总和,而每一个文件的读取时间是 * 前面的累计时间加一起,所以这样就需要两次累加,先看程序就知道了 */ import java.util.Arrays; import java.util.Scanner; public class CiDaiZuiYouCunChu { private static int[] len,p,t;//len是么个程序的长度,p是它的被读取概率 private static int n;//用来存放有几个磁带 public static void main(String[] args){ @SuppressWarnings("resource") Scanner input = new Scanner(System.in); while (true){ n = input.nextInt(); len = new int[n+1];//len,p,t数组都是不用[0]号位置 p = new int[n+1]; t = new int[n+1]; for(int i=1; i<=n; i++){//对于这n个位置,进行每个程序的len和p的输入 len[i] = input.nextInt(); p[i] = input.nextInt(); } double result = greedy(); System.out.println(String.format("%.4f", result));//结果就是总累加时间除以累加概率 } } private static double greedy(){ for(int i=1; i<=n; i++) t[i] = p[i] * len[i]; //t数组存放的是读取该程序的时间,实际就是存放的是每一个程序长度的概率权值 Arrays.sort(t);//对t数组进行排序 //而我们最终要的t数组不是每一个的程序读取时间,而是该读取到第i个程序的累计时间 for(int i=2; i<=n; i++) t[i] += t[i-1]; int totalTime = 0;//初始化总时间为0 double totalP = 0; for(int i=1; i<=n; i++){ totalTime += t[i];//总时间就是所有“二次处理后”的t数组的每个元素的累加 totalP += p[i];//总概率就是所有概率的总和 } return totalTime/totalP; } }