poj2976Dropping tests(最大化平均值)

本文介绍了一种典型的平均值最大化问题及其解决方案。通过二分查找算法,在给定的n个元素中选择n-k个元素,使得剩余元素的平均值达到最大。文章提供了完整的C++实现代码,并解释了如何进行二分验证。

题意:从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));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值