poj 2976 drop texts(二分搜索)

来源:互联网 发布:雷欧团灭mac的怪兽 编辑:程序博客网 时间:2024/05/19 17:09

题目链接:点击打开链接


二分搜索答案。

若 某些a[i]的和/某些b[i]的和>=x;  则某些a[i]的和-这些b[i]*x的和>=0 ;这样只要从大到小选n-k个a[i]-b[i]*x求和,如果和大于等于0就可行(这个公式其实很好理解)

根据这个公式去2分搜索答案即可

代码:

#include <iostream>#include <cstdio>#include <cstring>#define eps 1e-7#include <algorithm>using namespace std;int a[1005];int b[1005];double p[1005];int n,k;bool cmp(double a,double b){    return a>b;}bool C(double mid){    for(int i=1;i<=n;i++){        p[i]=a[i]-mid*b[i];    }    sort(p+1,p+n+1,cmp);    double sum=0;    for(int i=1;i<=k;i++){        sum+=p[i];    }    if(sum>=0) return 1;    return 0;}int main(){    while(~scanf("%d%d",&n,&k),n){        k=n-k;        for(int i=1;i<=n;i++){            scanf("%d",&a[i]);        }        for(int i=1;i<=n;i++){            scanf("%d",&b[i]);        }        double l=0,r=1;        double mid;        while(r-l>eps){            mid=(r+l)/2;            if(C(mid)) l=mid;            else r=mid;        }        printf("%.0f\n",100*(mid+eps));    }    return 0;}



0 0
原创粉丝点击