算法设计与分析: 4-3 磁带最优存储问题

 版权声明:本文为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;
    }
}
原文地址:https://www.cnblogs.com/shallow920/p/12862972.html