问题描述:
设有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