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