1. 程式人生 > >poj1064 Cable master

poj1064 Cable master

double ref bool stream http fin print ostream pre

Cable master

POJ - 1064

題目大意:

有N條繩子,它們的長度分別為Li。如果從他們中切割出K條長度相同的繩子的話,這K條繩子每條最長能有多長?答案保留到小數點後2位

二分答案:

可以認為是最大化最小值,答案範圍左右邊界分別為0和最長繩子的長度

不知道為什麽在check(mid)=1的時候ans=mid最後輸出的ans不一定是最優解

一組可以卡死這種做法的數據:

6 10

7.35 6.27 3.69 4.44 2.17 8.37

(標準輸出2.45,錯誤輸出2.44)

必須要在結果中輸出r才行

#include<iostream>
#include
<cstdio> #include<cstring> #include<cmath> #define maxn 100100 using namespace std; double l,r,a[maxn]; int N,K; double Max(double x,double y){return x>y?x:y;} bool check(double x){ int cnt=0; for(int i=1;i<=N;i++){ cnt+=floor(a[i]/x); } if(cnt>=K)return
1; else return 0; } int main(){ scanf("%d%d",&N,&K); for(int i=1;i<=N;i++){ scanf("%lf",&a[i]); r=Max(r,a[i]); } while(r-l>0.001){ double mid=(l+r)/2.0; if(check(mid))l=mid; else r=mid; } printf("%.2f",floor(r*100
)/100); }

poj1064 Cable master