原来这题是用前缀和加浮点二分做的。。都没学过。。。菜了菜了
这里有位大佬写的很详细——》https://www.acwing.com/solution/content/1148/
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[100050],b[100050];
double sum[100050];
int n,m,x,y;
bool check(double avg,int k,int t,int c[]){
memset(sum,0,sizeof(sum));
for(int i = 1;i<=t;i++) sum[i] = sum[i-1] + c[i] - avg;
double minn = 1e9;
for(int i = 0,j = k;j<=t;i++,j++){
minn = min(minn,sum[i]);
if(sum[j] - minn >= 1e-8) return true;
}
return false;
}
int main(){
scanf("%d%d%d%d",&n,&m,&x,&y);
getchar();
for(int i = 1;i<=n;i++) scanf("%d",a+i);
getchar();
for(int i = 1;i<=m;i++) scanf("%d",b+i);
getchar();
double l = 0,r = 1e5+10,mid,ans = 0.0;
while( r - l > 1e-8){
mid = (l+r) / 2;
if(check(mid,x,n,a)) l = mid;
else r = mid;
}
ans += r;
l = 0, r = 1e5+10;
while( r - l > 1e-8){
mid = (l+r) / 2;
if(check(mid,y,m,b)) l = mid;
else r = mid;
}
ans += r;
printf("%.10lf",ans);
}
程序中我写1e-5误差挺大的。。直接案例都不过。。