【算法分析与设计】磁带最优存储问题

问题描述:
设有 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
#include
#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;
}

仅供学习,转发注明出处!!!

你可能感兴趣的:(算法,数据结构,c++)