1. 程式人生 > >二分搜尋-poj1064

二分搜尋-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; }