Farmer John’s farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <= 2000.
FJ wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. The block must contain at least F (1 <= F <= N) fields, where F given as input.
Calculate the fence placement that maximizes the average, given the constraint.
Line 1: Two space-separated integers, N and F.
Lines 2…N+1: Each line contains a single integer, the number of cows in a field. Line 2 gives the number of cows in field 1,line 3 gives the number in field 2, and so on.
10 6
6
4
2
10
3
8
5
9
4
1
6500
題意就是給你一些數讓你找出個數不少於F的連續的一段使之平均值最大
枚舉會超時,時間複雜度爲O(n)才行
假如有
10 6
4
2
1000
10
3
8
5
9
800
6
此時明顯是第三個到第九個這一段平均值最大,結合代碼不難理解當平均值取262時,min_val會停留在前兩個,ans會停留在前九個
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; double a[100001], b[100001], sum[100001]; int main() { //freopen("input.txt", "r", stdin); int N, F; cin >> N >> F; for (int i = 1; i <= N; i++) scanf("%lf", &a[i]); double eps = 1e-5; double l = -1e6, r = 1e6; while (r - l > eps) { double mid = (l + r) / 2; for (int i = 1; i <= N; i++) b[i] = a[i] - mid; for (int i = 1; i <= N; i++) sum[i] = (sum[i - 1] + b[i]); double ans = -1e10; double min_val = 1e10; for (int i = F; i <= N; i++) { min_val = min(min_val, sum[i - F]); ans = max(ans, sum[i] - min_val); } if (ans >= 0) l = mid; else r = mid; cout << mid << endl; } cout << int(r * 1000) << endl; }
也看了一些題解,覺得這個有點意思
本人也是新手,也是在學習中,勿噴
轉載請註明出處
歡迎有問題的小夥伴一起交流哦~