zoukankan      html  css  js  c++  java
  • POJ2976:Dropping tests——题解

    http://poj.org/problem?id=2976

    题目大意:给定n个二元组(a,b),从中取n-k个,使得100*∑a/∑b最大。

    01分数规划裸题,设λ是小于等于最优解的,那么λ<=∑a/∑b,先通过移项来得到新的表达法∑a-λ∑b>=0。

    就可以二分答案做了。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef double dl;
    const int N=1005;
    const dl eps=1e-7;
    dl a[N],b[N],t[N];
    int n,k;
    double solve(dl l,dl r){
        while(r-l>eps){
        dl mid=(l+r)/2;
        for(int i=1;i<=n;i++)t[i]=a[i]-mid*b[i];
        sort(t+1,t+n+1);
        dl sum=0;
        for(int i=k+1;i<=n;i++)sum+=t[i];
        if(sum>0)l=mid;
        else r=mid;
        }
        return r;
    }
    int main(){
        while(scanf("%d%d",&n,&k)!=EOF&&n+k){
        for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
        for(int i=1;i<=n;i++)scanf("%lf",&b[i]);
        printf("%.f
    ",solve(0,1)*100);
        }
        return 0;
    }
  • 相关阅读:
    Python3之网络编程
    Python3之内置函数
    Python3之面向对象
    Python3之函数
    Python3基础数据类型-字符串
    else配合while或者for循环只用注意点
    字符串
    元组
    48964
    1651
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8266662.html
Copyright © 2011-2022 走看看