POJ 3757 Simple Distributed storage system 01分数规划

来源:互联网 发布:windows手机壁纸 编辑:程序博客网 时间:2024/06/03 23:05

时空隧道


题意:
给出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 NeighThornusing 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

0 0
原创粉丝点击