poj 2976 drop texts(二分搜索)

题目链接:点击打开链接


二分搜索答案。

若 某些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;
}




你可能感兴趣的:(二分搜索)