POJ2976:Dropping tests——题解

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[N],b[N],t[N];
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;
}

 

posted @ 2018-01-11 08:11  luyouqi233  阅读(208)  评论(0编辑  收藏  举报