POJ 1064
阿新 • • 發佈:2018-11-06
本題大概意思就是 有n個繩子。我想要切出k段長短一致的繩子,那麼求最長能切多長;
首先想一下最暴力的方法,那就是暴力列舉,從 0.00 一直列舉到 max.00 由於保留兩位小數,這個過程是 O(n) 題中資料若是給出的話 列舉需要 最大值為 100000.00 需要 1e7 位數字,但之後還要跑一邊 n個繩子 整道題的時間就會炸掉。
所以暴力列舉明顯會超時。那麼 列舉的目的是什麼,是想去尋找一個滿足條件的值 對吧,那麼二分法 這裡就派上用場了
用二分法優化 搜尋過程 時間消耗就會大大減少。
程式碼如下。。建議先不要看。。自己想一下。
#include <cstdio> #include <cstring> #include <cmath> using namespace std; const int maxn = 1e5+5; int n,k; double s[maxn]; bool judge(double x) { int num = 0; for(int i=1;i<=n;i++) { num += (int)(s[i] / x); } return num >= k; } int main() { while(scanf("%d%d",&n,&k)!=EOF) { double sum=0; for(int i=1;i<=n;i++) { scanf("%lf",&s[i]); sum+=s[i]; } double l = 0,r = sum/k, m; for(int i=0;i<100;i++) { m = (r + l) / 2; if(judge(m)) { l = m; } else { r = m; } } printf("%.2lf\n", l); } return 0; }