poj1064 Cable master
阿新 • • 發佈:2017-06-18
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)return1; 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