poj2976Dropping tests(最大化平均值)

题意:从n个东西里面取还剩k个东西使它们的平均值最大。
思路:典型平均值最大化 问题,标准解法二分,这里是剩下k个,所以取n-k个东西。
详见挑战程序设计143页。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1010],b[1010];
int n,k;
bool check(double x)
{
    double c[1010];
    for(int i=0;i<n;i++) c[i]=a[i]-x*b[i];
    sort(c,c+n);
    double sum=0;
    for(int i=n-1;i>=n-k;i--) sum+=c[i];
    return sum>=0;
}

int main()
{
    while(~scanf("%d%d",&n,&k)){
        if(n==0&&k==0) break;//避免n=1,k=0的情况
        k=n-k;
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n;i++) scanf("%d",&b[i]);
        double l=0,r=1.0;
        for(int i=0;i<100;i++){
           double mid=(l+r)*0.5;
           if(check(mid)) l=mid;
           else r=mid;
        }
        printf("%.0f\n",(l*100));
    }
}

你可能感兴趣的:(poj2976Dropping tests(最大化平均值))