二分搜索-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;
        }
    }
   int res=ub*100;
     double  sum=double(res)*0.01; printf("%.2lf\n",sum);
//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; }

 

最后显示的必须是r不能是mid。因为mid可能是正好可以,取整后就不一定了。但是r可以。

floor()是向下取整

ceil()是向上取整

round是四舍五入

posted @ 2018-11-17 10:06  里昂静  阅读(117)  评论(0编辑  收藏  举报