2 条题解
-
0
-
0
简单二分。
显然 的时间复杂度无法通过。
使子段平均值最大,考虑二分。
可以二分平均值 ,然后判断是否有满足条件的和 且长度 的子段。
记录一个前缀和数组 ,变为对于每个 ,看是否存在 使得 且 。这个东西显然可以变为查询 的某一个前缀中是否存在一个值使得 ,从前往后扫一遍做一个前缀 即可。
时间复杂度:,其中 为设置的精度, 为值域。
代码:
#include<bits/stdc++.h> using ll = long long; using pii = std::pair<int, int>; const int N = 3e5 + 5; const double eps = 1e-6; int n, k; int a[N]; double b[N]; bool check(double mid) { for (int i = 1; i <= n; i++) { b[i] = b[i - 1] + a[i] - mid; } double res = -1, mnv = 1e9; for (int i = k; i <= n; i++) { mnv = std::min(mnv, b[i - k]); res = std::max(res, b[i] - mnv); } return res >= 0; } int main() { scanf("%d %d", &n, &k); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); double l = 1, r = 1e6; while (l + eps < r) { double mid = (l + r) / 2; if (check(mid)) l = mid; else r = mid; } printf("%.6lf\n", l); return 0; }
- 1
信息
- ID
- 10891
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 26
- 已通过
- 8
- 上传者