POJ 2976 Dropping tests(二分答案)

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

【题目大意】

  给出每门成绩的总分和得分,去除k门成绩之后
  使得剩余的成绩分数和除以总分得到的数字最大,要求精度在三位小数之内四舍五入到整数

【题解】

  如果答案是x,那么必有选取的几门课程sigma(a*100)>=sigma(b*x)
  至于选取,就可以根据a*100-b*x排序,贪心选取即可。
  对于最后的精度处理问题,只要将数据放大处理末尾即可。

【代码】

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1010;
struct data{long long a,b;}p[N];
int n,m,k; 
bool cmp(data a,data b){return a.a*1000000-a.b*m>b.a*1000000-b.b*m;}
bool check(int x){
    m=x;
    sort(p+1,p+n+1,cmp);
    long long cnt=0;
    for(int i=1;i<=k;i++)cnt+=p[i].a*1000000-p[i].b*x;
    return cnt>=0;
}
int main(){
    while(~scanf("%d%d",&n,&k),n+k){
        k=n-k;
        for(int i=1;i<=n;i++)scanf("%lld",&p[i].a);
        for(int i=1;i<=n;i++)scanf("%lld",&p[i].b);
        int l=0,r=1000000,ans;
        while(l<=r){
            int mid=(l+r)>>1;
            if(check(mid))l=mid+1,ans=mid;
            else r=mid-1;
        }printf("%d
",ans/10000+(ans%10000>=5000));
    }return 0;
}

  

原文地址:https://www.cnblogs.com/forever97/p/poj2976.html