- 代码里我是用 a、c 数组存两个序列
核心代码:
double eps = 1e-6;
double l = -1e6, r = 1e6;
while(r - l > eps)
{
double mid = (r + l) / 2;
for(int i = 0; i < n; i++)
b[i] = a[i] - mid;
for(int i = 0; i < n; i++)
sum1[i] = sum1[i - 1] + b[i];
double ans1 = -1e10, minval = 1e10;
for(int i = L - 1; i < n; i++)
{
minval = min(minval, sum1[i-L]);
ans1 = max(ans1, sum1[i] - minval);
}
if(ans1 > 0) l = mid;
else r = mid;
}
accode:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e5 + 10;
double a[maxn], b[maxn], c[maxn];
double sum1[maxn], sum2[maxn];
int main()
{
int n, m, L, R;
cin>>n>>m>>L>>R;
for(int i = 0; i < n; i++)
scanf("%lf", &a[i]);
for(int i = 0; i < m; i++)
scanf("%lf", &c[i]);
double eps = 1e-6;
double l = -1e6, r = 1e6;
while(r - l > eps)
{
double mid = (r + l) / 2;
for(int i = 0; i < n; i++)
b[i] = a[i] - mid;
for(int i = 0; i < n; i++)
sum1[i] = sum1[i - 1] + b[i];
double ans1 = -1e10, minval = 1e10;
for(int i = L - 1; i < n; i++)
{
minval = min(minval, sum1[i-L]);
ans1 = max(ans1, sum1[i] - minval);
}
if(ans1 > 0) l = mid;
else r = mid;
}
double ans = l;
l = -1e6, r = 1e6;
while(r - l > eps)
{
double mid = (r + l) / 2;
for(int i = 0; i < m; i++)
b[i] = c[i] - mid;
for(int i = 0; i < m; i++)
sum2[i] = sum2[i - 1] + b[i];
double ans1 = -1e10, minval = 1e10;
for(int i = R - 1; i < m; i++)
{
minval = min(minval, sum2[i-R]);
ans1 = max(ans1, sum2[i] - minval);
}
if(ans1 > 0) l = mid;
else r = mid;
}
ans += l;
printf("%.10f\n", ans);
return 0;
}