POJ2976 Dropping tests

 摘自大佬博客:

https://blog.csdn.net/hzoi_ztx/article/details/54898323

 

给出n组ai和bi,去掉k个使得a的总和除以b的总和最大

01分数规划问题

 

把这个看成一次函数
y=B-A*x
对于每组{xi}都对应一条直线,如图

 

而函数解为直线与x轴焦点,且最优解离原点最远。
这时,可以考虑二分,随意悬垂一条直线,如果与直线焦点在x轴上方,那么就是取小了,反之取大了,如果正好在x轴上,那就是这个解。

double check(double x){
For(i,1,n)t[i]=a[i]-b[i]*x;
sort(t+1,t+1+n);
FFor(i,n,m+1)ans+=t[i];
return ans;
}
mi=min(b[i]),mx=max(a[i]);
l=0,r=mx/mi;
while(r-l>eps){
if(check(mid)>0)l=mid;
else r=mid;
}
printf("%.0f",mid*100);

 

posted @ 2018-08-03 00:04  planche  阅读(77)  评论(0编辑  收藏  举报