[poj2976]Dropping tests(01分数规划,转化为二分解决)

Posted elpsycongroo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[poj2976]Dropping tests(01分数规划,转化为二分解决)相关的知识,希望对你有一定的参考价值。

题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式技术图片.的最大值

解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交)

或者r-l<=1e-3(右边是精度)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define maxn 1002
#define eps 1e-8
using namespace std;
typedef long long ll;
int n,k;
double ans;
struct node{
    int a,b;
}num[maxn];
bool cmp(node &x,node &y){
    return x.a-x.b*ans>y.a-y.b*ans;
}
bool check(double x){
    ans=x;
    sort(num+1,num+n+1,cmp);
    double sum=0;
    for(int i=1;i<=n-k;i++) sum+=num[i].a-x*num[i].b;
    return sum>=-eps;
}
double erfen(double l,double r){
    for(int i=1;i<=1000;i++){
        double mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid;
    }
    return r;
}
int main(){
    while(cin>>n>>k){
        if(!n&&!k) break;
        for(int i=1;i<=n;i++) cin>>num[i].a;
        for(int i=1;i<=n;i++) cin>>num[i].b;
        double ans=erfen(0,1.0*(ll)100000000000);
        cout<<(int)(100*ans)<<"
";
        //printf("%d
",(int)ans);
    }

    return 0;
}

 

以上是关于[poj2976]Dropping tests(01分数规划,转化为二分解决)的主要内容,如果未能解决你的问题,请参考以下文章

poj2976 Dropping tests

[POJ2976]Dropping tests

POJ2976Dropping tests(分数规划)

POJ - 2976 Dropping tests (01分数规划)

[POJ2976] Dropping tests

POJ-2976 Dropping tests---二分最大化平均值