POJ2976 Dropping tests 最大化平均值(二分)

来源:互联网 发布:js 浮点数相加 编辑:程序博客网 时间:2024/05/21 12:51

题目链接:http://poj.org/problem?id=2976


题目大意:n场测试,每场测试bi道题,答对其中的ai道,最终的得分为∑ai / ∑bi,现在可以从中除去k场测试的成绩,使得最终的得分最大。


分析:和POJ3111 K Best一样,只需找出最大值即可,这里就不多说了。


实现代码如下:

#include <cstdio>#include <algorithm>using namespace std;const int M=1005;const double inf=999999999.0;struct node{    int a,b;    double y;    bool operator <(const node &a) const    {        return y>a.y;    }}test[M];int n,k;bool judge(double x){    for(int i=0;i<n;i++)      test[i].y=test[i].a-x*test[i].b;    sort(test,test+n);    double sum=0;    for(int i=0;i<k;i++)      sum+=test[i].y;    return sum>=0;}void solve(){    double left=0,right=inf;    for(int i=0;i<100;i++)    {        double mid=(left+right)/2;        if(judge(mid)) left=mid;        else right=mid;    }    printf("%d\n",(int)(left*100+0.5));}int main(){    while(scanf("%d%d",&n,&k))    {        if(n==0&&k==0) break;        k=n-k;        for(int i=0;i<n;i++)          scanf("%d",&test[i].a);        for(int i=0;i<n;i++)          scanf("%d",&test[i].b);        solve();    }    return 0;}


0 0
原创粉丝点击