题意
两数组求连续子段最大平均数
题解
二分
acwing上有一道很相似的题
我的总结https://www.acwing.com/blog/content/9263/
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 10;
const double eps = 1e-8;
double sum[MAX];
double a[MAX];
double b[MAX];
bool check1 ( double avg, int n, int m ) {
for ( int i = 1; i <= n; i++ ) {
sum[i] = sum[i - 1] + a[i] - avg;
}
double minn = 0;
for ( int i = 0, j = m; j <= n; i++, j++ ) {
minn = min ( minn, sum[i] );
if ( sum[j] - minn >= 0 ) return 1;
}
return 0;
}
bool check2 ( double avg, int n, int m ) {
for ( int i = 1; i <= n; i++ ) {
sum[i] = sum[i - 1] + b[i] - avg;
}
double minn = 0;
for ( int i = 0, j = m; j <= n; i++, j++ ) {
minn = min ( minn, sum[i] );
if ( sum[j] - minn >= 0 ) return 1;
}
return 0;
}
//最大值
int main() {
int n, m, x, y;
scanf ( "%d%d%d%d", &n, &m, &x, &y );
double L1 = 0, R1 = -1;
double L2 = 0, R2 = -1;
for ( int i = 1; i <= n; i++ ) {
scanf ( "%lf", &a[i] );
R1 = max ( R1, a[i] );
}
for ( int i = 1; i <= m; i++ ) {
scanf ( "%lf", &b[i] );
R2 = max ( R2, b[i] );
}
while ( R1 - L1 > eps ) {
double mid = ( L1 + R1 ) / 2;
if ( check1 ( mid, n, x ) ) L1 = mid;
else R1 = mid;
}
while ( R2 - L2 > eps ) {
double mid = ( L2 + R2 ) / 2;
if ( check2 ( mid, m, y ) ) L2 = mid;
else R2 = mid;
}
printf ( "%.7f\n", L1 + L2 );
}