二分搜索-poj1064

题目大概意思是:给你N个长度的电缆,需要你编写程序 将它分割成 K 根长度相等的小电缆。而我们的目的就是要求出分割出的 最大长度 可以为多少。此处可以应用二分搜索的知识来实现查找最终长度。

代码实现

#include <cstdio>
#include <cmath>
using namespace std;
int N,K;
double L[10010];
const int INF = 1e5+10;

bool C(double x){
    int num=0;
    for(int i=0;i<N;i++){//统计以长度为x的分法可以分割出的电缆数目
        num+=L[i]/x;
    }
    return num>=K;//如果可以分割出大于或等于K数目的电缆,那么就返回true
}

void solve(){
    double lb=0,ub=INF;
    for(int i=0;i<100;i++){
        double mid=(lb+ub)/2;
        if(C(mid)){//如果此时mid分割出的电缆数符合条件,那么就朝着更长的方向去进行分割
            lb=mid;
        }else{//否则,说明以mid为长度不能分割出K跟电缆,那么需要以更小的长度进行分割
            ub=mid;
        }
    }
    printf("%.2f\n",floor(ub*100)/100);
    //floor()函数实现向下取整,具体用法请见https://blog.csdn.net/dangzhangjing97/article/details/81279862
}

int main(){
    while(~scanf("%d%d",&N,&K)){
        for(int i=0;i<N;i++){
            scanf("%lf",&L[i]);
        }
        solve();
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/LJHAHA/p/9972960.html