洛谷P2115 Sabotage G題解
阿新 • • 發佈:2021-08-16
題解
本蒟蒻又來了,這道題可以用二分答案來解決。我們可以設答案最小平均產奶量為 \(x \ (x \in[1,10000])\) 。然後二分搜尋 \(x\) 的最小值。
\[\frac{sum-sum[l,r]}{n-(r-l+1)}\leq x \]\[nx-(r-l+1)x\geq sum-sum[l,r] \]\[sum-nx \leq \sum\limits_{i=l}^r{(a[i]-x)} \]對於如何求 \(\sum\limits_{i=l}^r{(a[i]-x)}\) 的最大值,這個很簡單,套用最大子段和的解法即可。
最後根據 \(sum-nx \leq \sum\limits_{i=l}^r{(a[i]-x)}\)
貼一下程式碼
#include<iostream> using namespace std; const double e = 1e-4; int n, a[100001]; double sum = 0; bool check(double x) { double snx = sum - n * x; double s = 0; for (int i = 2; i < n; i++) { s += a[i] - x; if (s >= snx) return 1; if (s < 0) s = 0; } return 0; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum += a[i]; } double l = 1, r = 10000; while (r-l>=e) { double mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid+e; } printf("%.3lf",l); return 0; }