二分搜尋-poj1064
阿新 • • 發佈:2018-11-17
題目大概意思是:給你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; }