POJ 1064 Cable master (二分答案,G++不過,C++就過了)
阿新 • • 發佈:2019-01-24
題目:
這題有點坑,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;
}