1 solutions
-
0
由于每次都是对字段和的操作,那么我们用前缀和。
然后二分答案找到最大的平均数。 这个时候我们还可以有一个操作。
每次二分得到的mid,我们把a数组每个数字都减去mid,然后进入二分函数判断最大的字段和是不是≥0即可。
#include<bits/stdc++.h> using namespace std; const int N = 1e6+11; int n, L; double a[N], b[N], s[N]; bool cheek(){ double maxx = -1, minn = 1e10; for(int i=L;i<=n;i++){ minn = min(minn, s[i-L]); maxx = max(maxx, s[i] - minn); }return maxx >= 0; } int main(){ scanf("%d%d",&n,&L); for(int i=0;i<n;i++)scanf("%lf",&a[i]); double l = -1, r = 2002, dep = 1e-5; while(r - l > dep){ double mid = (l + r) / 2; for(int i=0;i<n;i++) b[i] = a[i] - mid; for(int i=0;i<n;i++) s[i+1] = s[i] + b[i]; if(cheak()) l = mid; else r = mid; } r *= 1000; int ans = r; printf("%d\n",ans); return 0; }
- 1
Information
- ID
- 486
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 7
- Accepted
- 3
- Uploaded By