磁带最优存储问题

问题描述:

  设有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 个程序在磁带上的一个存储次序,使平均读取时间达到最小。

代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn=100;
 6 struct node
 7 {
 8     double p,l,mul;
 9 }nodes[maxn];
10 
11 bool cmp(node a,node b)
12 {
13     return a.mul<b.mul;
14 }
15 int main()
16 {
17     int n;
18     cin>>n;
19     double sum=0;
20     for(int i=1;i<=n;i++)
21     {
22         cin>>nodes[i].l>>nodes[i].p;
23         sum+=nodes[i].p;
24     }
25     for(int i=1;i<=n;i++)
26     {
27         nodes[i].p=nodes[i].p/sum;
28         nodes[i].mul=nodes[i].l*nodes[i].p;
29     }
30     sort(nodes+1,nodes+n+1,cmp);
31     double t=0,ans=0;
32     for(int i=1;i<=n;i++)
33     {
34         t+=nodes[i].mul;
35         ans+=t;
36     }
37     cout<<ans<<endl;
38     return 0;
39 }

输入示例:

5

71     872

46     452

9       265

73     120

35      85

输出示例

85.6193

猜你喜欢

转载自www.cnblogs.com/wangxuelin/p/9034735.html