您的位置:首页 > 其它

POJ 3757 Simple Distributed storage system 01分数规划

2016-10-13 00:06 471 查看
时空隧道

题意:

给出n台机器,选出k台来完成任务,最小化fi*ci…

对于每个机器有三个属性p b c

每台机器完成任务的时间=f[i]/p[i]+f[i]/b[i]

要求每台机器完成任务时间相同…并且∑f[i]=F

分析:

最优值问题…考虑转化为可行性问题…那不就是01分数规划么…

01分数规划详解(请自行出门右转)

怎么转化为基本模型呢…

先把信息列出来吧…

ans=∑f[i]*c[i]…

time=f[i]/p[i]+f[i]/b[i]—>f[i]=time*p[i]*b[i]/(p[i]+b[i])…

F=∑f[i]—>F=time*∑x[i] (x[i]=p[i]*b[i]/(p[i]+b[i]))…

time=F/∑x[i]…

ans=∑(x[i]*c[i]*F/∑x[i])…

然后就套模板好啦…

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
const int maxn=20000+5;
int n,k;
double F,p[maxn],b[maxn],c[maxn],x[maxn],ans,mid;
struct M{
double p,b,c,x;
friend bool operator < (M a,M b){
return F*a.x*a.c-mid*a.x<F*b.x*b.c-mid*b.x;
}
}s[maxn];
inline bool check(void){
sort(s+1,s+n+1);
double sum=0;
for(int i=1;i<=k;i++)
sum+=F*s[i].x*s[i].c-mid*s[i].x;
if(sum>=0)
return true;
return false;
}
signed main(void){
scanf("%d%d%lf",&n,&k,&F);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&s[i].p,&s[i].b,&s[i].c),s[i].x=s[i].p*s[i].b/(s[i].p+s[i].b);
double l=0,r=10000000000;
while(r-l>=1e-6){
mid=(l+r)/2.0;
if(check())
ans=mid,l=mid;
else
r=mid;
}
printf("%.4f\n",ans);
return 0;
}


by >_< NeighThorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: