算法設計與分析: 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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM