首页 > 其他 > 详细

nyist 914

时间:2016-02-07 17:24:43      阅读:239      评论:0      收藏:0      [点我收藏+]

#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;

int w[10005],v[10005];
int n,k;
double maxu,c[10005];
const double ex=0.000001;

bool Check(double x){//若是选定当前单位价值的结果是可以或者不可以

for(int i=0;i<n;i++)
c[i]=v[i]-x*w[i];
sort(c,c+n);
double sum=0;
for(int i=0;i<k;i++)//判定当前单位价值时,是不是比较好的选择,>=0为好,则可能有更优的情况
sum+=c[n-1-i];
return sum>=0;
}

double ans(double x){

double fir=0,las=x,mid;
while(fabs(fir-las)>ex){
mid=(fir+las)/2.0;
if(Check(mid))//若是当前单位价值都满足,则最终结果不会低于当前单位价值
fir=mid;
else
las=mid;
}
return fir;
}

int main(){

while(scanf("%d%d",&n,&k)==2){
maxu=-1;
for(int i=0;i<n;i++){
scanf("%d%d",&w[i],&v[i]);
if(v[i]*1.0/w[i]>maxu)//确定单位价值的上限值
maxu=v[i]*1.0/w[i];
}
printf("%.2lf\n",ans(maxu));
}
return 0;
}

/*

二分确定单位价值的范围,贪心用来确定是否会出现更优解

*/

nyist 914

原文:http://www.cnblogs.com/huaixiaohai2015/p/5184729.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!