【算法分析与设计】磁带最优存储问题
2024-01-02 08:25:28
问题描述:
设有 n 个程序{1,2,…, n }要存放在长度为 L 的磁带上。程序 i 存放在磁带上的长度是li ,1 ≤ i ≤ n 。这 n 个程序的读取概率分别是p1, p2 ,……, pn ,且 ∑pi(i=1~n) = 1。
如果将这 n 个程序按i1,i2 ,……,in 的次序存放,则读取程序ir 所需的时间tr = c*∑pi li (i=1 ~ r)。这 n 个程序的平均读取时间为∑tr (r=1 ~ n)。
磁带最优存储问题要求确定这 n 个程序在磁带上的一个存储次序,使平均读取时间达到最小。试设计一个解此问题的算法,并分析算法的正确性和计算复杂性。
编程任务:
对于给定的 n 个程序存放在磁带上的长度和读取概率,编程计算 n 个程序的最优存储方案。
数据输入:
输入数据第一行是正整数 n,表示文件个数。接下来的 n 行中,每行有 2 个正整数 a 和 b,分别表示程序存放在磁带上的长度和读取概率。实际上,第 k 个程序的读取概率 ak / ∑ai (i = 1 ~ n)。对所有输入均假定 c=1。 0 < n ≤ 10000
结果输出:
将编程计算出的最小平均读取时间输出。
样例输入:
5 71 872 46 452 9 265 73 120 35 85
样例输出:
85.6193
代码实现:
#include<iostream>
#include<algorithm>
#define MAX 10000
using namespace std;
typedef struct Tnode
{
int len;
int pr;
}Tnode,tnode[MAX];
bool cmp(Tnode a,Tnode b)
{
int x = a.len*a.pr,y = b.len*b.pr;
return x<y;
}
void minTimeCost(int n,tnode t)
{
int sum = 0;
for(int i = 0;i<n;i++)
{
sum+=t[i].pr;
}
double result;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<=i;j++)
{
result+=t[j].pr*1.0/sum*t[j].len;
}
}
cout<<result<<endl;
}
int main(){
int n;
cin>>n;
tnode t;
for(int i = 0;i<n;i++)
{
cin>>t[i].len>>t[i].pr;
}
sort(t,t+n,cmp);
minTimeCost(n,t);
return 0;
}
仅供学习,转发注明出处!!!
文章来源:https://blog.csdn.net/Walker501/article/details/135323666
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!