题目描述

设有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*(Pi1Li2+Pi2Li2+…+Pir*Lir)。这n 个程序的平均读取 时间为t1+t2+…+tn。 磁带最优存储问题要求确定这n 个程序在磁带上的一个存储次序,使平均读取时间达到 最小。试设计一个解此问题的算法,并分析算法的正确性和计算复杂性。 编程任务: 对于给定的n个程序存放在磁带上的长度和读取概率,编程计算n个程序的最优存储方 案。

输入

由文件input.txt给出输入数据。第一行是正整数n,表示文件个数。接下来的n行中,
每行有2 个正整数a 和b, 分别表示程序存放在磁带上的长度和读取概率。 我觉得这里题目描述有错误,应该a是概率,b是长度
实际上第k个程 序的读取概率ak/(a1+a2+…+an)。对所有输入均假定c=1。

输出

输出一个实数,保留1位小数,表示计算出的最小平均读取时间。

示例输入

5
71 872
46 452
9 265
73 120
35 87

示例输出

85.619

算法设计

求解最短读取时间,可用贪心算法求解该问题,

  1. 先计算每个程序使用的概率
  2. 通过公式,计算每个程序的pi*li
  3. 将其递增排序(贪心求解)
  4. 用公式求解最优解
    (应该证明他具有贪心选择性质,可惜我不会,我赌他不考证明…)

代码


#include<stdio.h>
#include<iostream>
using namespace std;int Print(double a[],int n)
{for(int i=0;i<n;i++){cout<<a[i]<<" ";}cout<<endl;
}void Proba(double m[],int a[],int n)
{int sum=0;for(int i=0;i<n;i++){sum+=a[i];}for(int i=0;i<n;i++){m[i]=(double)a[i]/sum;}}
void calTime(double m[],double p[],int length[],int n)
{// m[0]=p[0]*length[0];for(int i=0;i<n ;i++){m[i]=p[i]*length[i];}Print(m,n);}
void sort(double m[],int n)
{double t;for(int i=0;i<n;i++){for(int j=i;j<n;j++){if(m[j]<m[i]){t=m[i];m[i]=m[j];m[j]=t;}}}Print(m,n);
}
double BestTime(double Evetime[],int n)
{double TR[n];TR[0]=Evetime[0];for(int i=1;i<n;i++){TR[i]=TR[i-1]+Evetime[i];}double sum=0;for(int i=0;i<n;i++){sum+=TR[i];}return sum;
}double MinTime(int a[],int b[],int n)
{double prob[n];Proba(prob,a,n);Print(prob,n);double Evetime[n];calTime(Evetime,prob,b,n);sort(Evetime,n);return BestTime(Evetime,n);
}int main()
{//为了简单,没从文件读取,直接键盘输入了int n;scanf("%d",&n);int a[n];int b[n];for(int i=0;i<n;i++){scanf("%d %d",a+i,b+i);}double t;t=MinTime(b,a,n);printf("最优时间为:%.3lf",t);
}

输出结果

算法复习之磁带最优储存问题相关推荐

  1. 贪心算法-磁带最优存储问题

    贪心算法通常是对某一值进行排序,然后再采取贪心策略进行求解.此问题贪心角度不同以往,它是对两因素进行综合处理.将它们的乘积进行排序. 题意:设有n 个程序{1,2,-, n }要存放在长度为L的磁带上 ...

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

    4-3 磁带最优存储问题 问题描述 设有 n 个程序{1,2,...,n}{1,2,...,n}\{1,2,..., n\}要存放在长度为 L 的磁带上.程序 i 存放在磁带上的长度是 lilil_i ...

  3. 贪心问题(Python代码实现)——磁带最优存储问题

    文章目录 磁带最优存储问题 贪心策略 问题模型 python实现代码 Python知识小结 关于Python sort sort()与sorted()的区别 今早任务--贪心算法,Python代码实现 ...

  4. 算法复习——动态规划篇之最长公共子序列问题

    算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...

  5. 磁盘最优存储与磁带最优存储问题

    磁带最优存储 题目描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是Li, 1<= i<= n.这n 个程序的读取概率分别是p1,p2,-,pn ...

  6. 考研DS备考|算法复习|编程or上机准备

    23考研算法复习 一.图论相关算法 1.拓扑排序 2.最小生成树 2.1 Prim算法朴素实现 2.2 最小生成树Kruskal实现 3.最短路 3.1朴素版Dijkstra 3.2Bellman-f ...

  7. 算法复习——动态规划篇之钢条切割问题

    算法复习--动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: ​ 现有一段长度为10的钢条,可以零 ...

  8. 【机器学习】基于粒子群算法的非线性函数寻优

    本微信图文介绍了基于粒子群算法的非线性函数寻优过程,并利用Matlab实现.

  9. 贪心:磁带最优存储与磁盘文件最优存储

    1.磁带最优存储问题 Input: 5 71 872 46 452 9 265 73 120 35 87 Output: 85.6193 Code: #include <bits/stdc++. ...

最新文章

  1. 古老的SSM企业级应用
  2. pytorch torch.item()(返回此张量的值作为标准Python数字。 这仅适用于具有一个元素的张量。)
  3. kaidi中 install cuda
  4. 【GVA】gorm多对多many2many删除数据的同时级联删除关联中间表中的关联数据
  5. python 画漫画_在漫画中画一条直线,罗宾逊投影
  6. 第一类第二类丢失更新
  7. 使用container的嵌套_ElementUI 技术揭秘(4)— Container 布局容器组件的设计与实现。...
  8. mqtt如何判断设备离线_污水处理设备公司给出的价格如何判断真实性?
  9. Asp.Net Mvc表单提交之List集合
  10. VS2005项目的安装与布署,包括卸载
  11. 数据库实验一——数据定义
  12. python 图片(pil库)将两个图片合成一张
  13. 搜索小技巧,八大搜索技巧
  14. php查询mysql充值_PHP + MYSQL 实现 用户注册/登录/充值 功能
  15. Rhino学习教程——1.3
  16. 从哪里跌倒就从哪里爬起来
  17. 微信团队的智能客服功能又出新功能了?
  18. 提升PR的秘籍:交叉连接
  19. 用R中的包实现逐步回归
  20. 个人计算机安全软件的使用,我不会用电脑之:安全软件篇

热门文章

  1. 《Kotlin 程序设计》第一章 Kotlin简介
  2. HJLF-E1 DC220V【反时限电流继电器】
  3. 计算机网络2 物理层
  4. 误删除了Adobe虚拟打印,如何恢复?
  5. 按头安利 好看又实用的毕业季插画素材看这里
  6. AutoDockFR:具有明确指定结合位点灵活性的蛋白质-配体对接研究进展
  7. java excel模板下载_JavaWeb-POI实现excel表格下载
  8. PPT文件找回打开密码
  9. 数组:左右两边数组的和相等
  10. DAQmx安装后无法使用DAQ助手的解决方案