算法复习之磁带最优储存问题
题目描述
设有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
算法设计
求解最短读取时间,可用贪心算法求解该问题,
- 先计算每个程序使用的概率
- 通过公式,计算每个程序的pi*li
- 将其递增排序(贪心求解)
- 用公式求解最优解
(应该证明他具有贪心选择性质,可惜我不会,我赌他不考证明…)
代码
#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);
}
输出结果
算法复习之磁带最优储存问题相关推荐
- 贪心算法-磁带最优存储问题
贪心算法通常是对某一值进行排序,然后再采取贪心策略进行求解.此问题贪心角度不同以往,它是对两因素进行综合处理.将它们的乘积进行排序. 题意:设有n 个程序{1,2,-, n }要存放在长度为L的磁带上 ...
- 算法设计与分析: 4-3 磁带最优存储问题
4-3 磁带最优存储问题 问题描述 设有 n 个程序{1,2,...,n}{1,2,...,n}\{1,2,..., n\}要存放在长度为 L 的磁带上.程序 i 存放在磁带上的长度是 lilil_i ...
- 贪心问题(Python代码实现)——磁带最优存储问题
文章目录 磁带最优存储问题 贪心策略 问题模型 python实现代码 Python知识小结 关于Python sort sort()与sorted()的区别 今早任务--贪心算法,Python代码实现 ...
- 算法复习——动态规划篇之最长公共子序列问题
算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...
- 磁盘最优存储与磁带最优存储问题
磁带最优存储 题目描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是Li, 1<= i<= n.这n 个程序的读取概率分别是p1,p2,-,pn ...
- 考研DS备考|算法复习|编程or上机准备
23考研算法复习 一.图论相关算法 1.拓扑排序 2.最小生成树 2.1 Prim算法朴素实现 2.2 最小生成树Kruskal实现 3.最短路 3.1朴素版Dijkstra 3.2Bellman-f ...
- 算法复习——动态规划篇之钢条切割问题
算法复习--动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: 现有一段长度为10的钢条,可以零 ...
- 【机器学习】基于粒子群算法的非线性函数寻优
本微信图文介绍了基于粒子群算法的非线性函数寻优过程,并利用Matlab实现.
- 贪心:磁带最优存储与磁盘文件最优存储
1.磁带最优存储问题 Input: 5 71 872 46 452 9 265 73 120 35 87 Output: 85.6193 Code: #include <bits/stdc++. ...
最新文章
- 古老的SSM企业级应用
- pytorch torch.item()(返回此张量的值作为标准Python数字。 这仅适用于具有一个元素的张量。)
- kaidi中 install cuda
- 【GVA】gorm多对多many2many删除数据的同时级联删除关联中间表中的关联数据
- python 画漫画_在漫画中画一条直线,罗宾逊投影
- 第一类第二类丢失更新
- 使用container的嵌套_ElementUI 技术揭秘(4)— Container 布局容器组件的设计与实现。...
- mqtt如何判断设备离线_污水处理设备公司给出的价格如何判断真实性?
- Asp.Net Mvc表单提交之List集合
- VS2005项目的安装与布署,包括卸载
- 数据库实验一——数据定义
- python 图片(pil库)将两个图片合成一张
- 搜索小技巧,八大搜索技巧
- php查询mysql充值_PHP + MYSQL 实现 用户注册/登录/充值 功能
- Rhino学习教程——1.3
- 从哪里跌倒就从哪里爬起来
- 微信团队的智能客服功能又出新功能了?
- 提升PR的秘籍:交叉连接
- 用R中的包实现逐步回归
- 个人计算机安全软件的使用,我不会用电脑之:安全软件篇