zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    左旋一个字符串和手摇反转法
    LCS
    游戏服务器学习_1
    面试题_带答案_2
    面试题_带答案
    安卓_13
    安卓_12activity
    安卓_12
    多盟_1
    安卓没删干净导致报错
  • 原文地址:https://www.cnblogs.com/forever97/p/poj2976.html
Copyright © 2011-2022 走看看