热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3757SimpleDistributedstoragesystem01分数规划

时空隧道题意:给出n台机器,选出k台来完成任务,最小化fi*ci…对于每个机器有三个属性pbc每台机器完成任务的时间f[i]p[i]f[i

时空隧道



题意:
给出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
#include
#include
#include
//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}s[maxn];
inline bool check(void){sort(s&#43;1,s&#43;n&#43;1);double sum&#61;0;for(int i&#61;1;i<&#61;k;i&#43;&#43;)sum&#43;&#61;F*s[i].x*s[i].c-mid*s[i].x;if(sum>&#61;0)return true;return false;
}
signed main(void){scanf("%d%d%lf",&n,&k,&F);for(int i&#61;1;i<&#61;n;i&#43;&#43;)scanf("%lf%lf%lf",&s[i].p,&s[i].b,&s[i].c),s[i].x&#61;s[i].p*s[i].b/(s[i].p&#43;s[i].b);double l&#61;0,r&#61;10000000000;while(r-l>&#61;1e-6){mid&#61;(l&#43;r)/2.0;if(check())ans&#61;mid,l&#61;mid;elser&#61;mid;}printf("%.4f\n",ans);return 0;
}


by >_

推荐阅读
author-avatar
王-闻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有