題目連接:http://bailian.openjudge.cn/p...ios
思路:
須要的等長網線數量C已知,要求儘量長,那麼咱們能夠列舉全部網線可能的長度len(0,max] , 計算出每種長度下網線的數量,時間複雜度爲 O(max*n)。爲了加快計算,咱們在列舉網線長度時,採用二分法,假如在 len下算出的網線數量c < C, 那麼就取一個更小的len嘗試,反之取更大的len嘗試,最優解L 知足 c(L) >= C, c(L+1) < C.spa
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 0x3f3f3f3f using namespace std; int a[10010]; int b[10010]; int n,m; int find(int x) { int h=0; for(int i=1;i<=n;i++) { h=h+a[i]/x; } return h; } int main() { cin>>n>>m; b[1]=0; for(int i=1;i<=n;i++) { double w; cin>>w; a[i]=w*100; b[2]=max(b[2],a[i]); } int l=0,r=b[2]; while(l<=r) { int mid=(l+r)/2; if(mid==0) { printf("0.00"); return 0; } if(find(mid)<m) { r=mid-1; } else l=mid+1; } printf("%.2lf",(l-1)/100.0); }
效率:
提交人 班級 結果 內存 時間 代碼長度 語言 提交時間code
Accepted 672kB 49ms 575 B G++