算法课本 4-3磁带最优存储问题
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct node{
double len;//长度
double p;//概率
double time;//时间
};
bool operator < (const node&p,const node &q){
return p.time<q.time;
}
int main()
{
int n;
cin>>n;
node num[n],temp;
int all=0;//统计概率和
for(int i=0;i<n;i++)
{
cin>>temp.len>>temp.p;//输入长度和原始概率
all+=temp.p;
num[i]=temp;
}
for(int i=0;i<n;i++)
{
num[i].p=num[i].p/all;//真实概率
num[i].time=num[i].len*num[i].p;//题目中给的
}
//按照读取时间由小到大排序
sort(num,num+n);
double ans=0,ans2=0;
for(int i=0;i<n;i++)
{
ans+=num[i].time;
ans2+=ans;//读完前面的才能读取现在的,所以是这样子求和
}
cout<<ans2<<endl;
}