zoukankan      html  css  js  c++  java
  • 磁盘最优存储问题【贪心算法】

    题目描述

    设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是Li, 1<= i<= n。这n 个程序的读取概率分别是p1,p2,...,pn,且pi+p2+...+pn = 1。如果将这n 个程序按 i1,i2,....,in 的次序存放,则读取程序ir 所需的时间tr=c*(Pi1*Li2+Pi2*Li2+...+Pir*Lir)。这n 个程序的平均读取 时间为t1+t2+...+tn。 磁带最优存储问题要求确定这n 个程序在磁带上的一个存储次序,使平均读取时间达到 最小。试设计一个解此问题的算法,并分析算法的正确性和计算复杂性。 编程任务: 对于给定的n个程序存放在磁带上的长度和读取概率,编程计算n个程序的最优存储方 案。
    输入
    由文件input.txt给出输入数据。第一行是正整数n,表示文件个数。接下来的n行中, 
    每行有2 个正整数a 和b,分别表示程序存放在磁带上的长度和读取概率。实际上第k个程 
    序的读取概率ak/(a1+a2+...+an)。对所有输入均假定c=1。
    输出:
    输出一个实数,保留1位小数,表示计算出的最小平均读取时间。

    输入样例:

    5
    71     872
    46     452
    9       265
    73     120
    35      87
    样例输出:
    85.6193


    • 分析:先根据磁带的长度与读取概率的乘积从小到大排序,然后根据题目公式计算即可。
    • 代码:
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    int n;
    struct node{
        int a,b;
    }p[1005];
    bool cmp(node a,node b){
        return a.a*a.b<b.a*b.b;
    }
    int main()
    {
        cin>>n;
        int sum=0;
        for(int i = 0;i < n; i++){
            cin>>p[i].a>>p[i].b;
            sum+=p[i].b;
        }
        sort(p,p+n,cmp);
        double t=0,tmp=0;
        for(int i=0;i<n;i++){
            tmp=0;
            for(int j=0;j<=i;j++){
                tmp+=p[j].a*(p[j].b*1.0/sum);
            }
            t+=tmp;
        }
        printf("%.4lf
    ",t);
        return 0;
    }
    
    /*
    5
    71 872
    46 452
    9 265
    73 120
    35 85
    */
    

  • 相关阅读:
    JWT在ASP.NET Core3.1的应用
    .NET Core 3.0中IAsyncEnumerable<T>有什么大不了的?
    C#类继承中构造函数的执行序列
    C#中的out 参数,ref参数,值参数
    ABP之启动配置
    ABP之模块系统
    ABP之N层架构
    ABP之什么是ABP(ASP.NET Boilerplate)
    如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)
    ABP之Setting
  • 原文地址:https://www.cnblogs.com/kzbin/p/9205216.html
Copyright © 2011-2022 走看看