1. 程式人生 > >POJ 1064 Cable master (二分答案,G++不過,C++就過了)

POJ 1064 Cable master (二分答案,G++不過,C++就過了)

題目:
這裡寫圖片描述

這題有點坑,G++過不了,C++能過。

條件:n個數據a[],分成k段,結果精度要求兩位小數。

問題:每段最長為多少?

思路:因為精度要求為兩位小數,我先把所有的長度a[]*100。

   我們對答案二分搜尋,把l設定為0,r設定為1000*10000*100+1(資料量每個資料最大的大小精度+1)。

   這樣我們搜尋的數就不用處理精度了,我們可以二分算出結果然後除以100。

程式碼:

#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <math.h> #include <queue> #include <assert.h> #include <stdio.h> #include <stdlib.h> using namespace std; typedef long long ll; #define INF 2147483647 //輸入 int n, k; double a[10010]; //返回分成k段最大的段長 double solve(ll sum) { ll l = 0, r = sum+1; //二分的左右端 ll mx = 0
; //儲存結果 while (l < r) { ll mid = (l + r) / 2; ll sum = 0; //段數求和 for (int i = 0; i < n; i++) sum += a[i] / mid; //每段長mid,可以分成k段 if (sum >= k) { mx = max(mx, mid); //更新答案 l = mid + 1; } else { r = mid; } } return
1.0*mx/100; } int main() { cin >> n >> k; ll sum = 0; for (int i = 0; i < n; i++) { cin >> a[i]; a[i] *= 100; //將段長乘以100 sum += a[i]; //對段長求和 } printf("%.2lf",solve(sum)); getchar(); getchar(); return 0; }