POJ 3757 Simple Distributed storage system 01分数规划

时空隧道


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值