您的位置:首页 > 运维架构

POJ2976:Dropping tests——题解

2018-01-11 08:11 225 查看

http://poj.org/problem?id=2976

题目大意:给定n个二元组(a,b),从中取n-k个,使得100*∑a/∑b最大。

01分数规划裸题,设λ是小于等于最优解的,那么λ<=∑a/∑b,先通过移项来得到新的表达法∑a-λ∑b>=0。

就可以二分答案做了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double dl;
const int N=1005;
const dl eps=1e-7;
dl a
,b
,t
;
int n,k;
double solve(dl l,dl r){
while(r-l>eps){
dl mid=(l+r)/2;
for(int i=1;i<=n;i++)t[i]=a[i]-mid*b[i];
sort(t+1,t+n+1);
dl sum=0;
for(int i=k+1;i<=n;i++)sum+=t[i];
if(sum>0)l=mid;
else r=mid;
}
return r;
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF&&n+k){
for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)scanf("%lf",&b[i]);
printf("%.f\n",solve(0,1)*100);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: