为什么我把二分的左点设为-1e9,把右点设为1e9,就是90pts(WA on 3),而把左点设为-1e5,把右点设为1e5,就AC了???
90分代码:
#include<bits/stdc++.h>
using namespace std;
int n,s,t,a[100010],q[100010];
double l=-1e9,r=1e9,mid,b[100010],sum[100010];
bool check(double k){
for(int i=1;i<=n;i++) b[i]=a[i]-k;
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
int l=1,r=0;
for(int i=1;i<=n;i++){
if(i>=s){
while(r>=l&&sum[i-s]<sum[q[r]]) r--;
q[++r]=i-s;
}
if(l<=r&&q[l]<i-t) l++;
if(l<=r&&sum[i]>=sum[q[l]]) return 1;
}
return 0;
}
int main(){
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
mid=(l+r)/2;
while(r-l>1e-4){
if(check(mid)) l=mid;
else r=mid;
mid=(l+r)/2;
}
printf("%.3lf",mid);
return 0;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,s,t,a[100010],q[100010];
double l=-1e9,r=1e9,mid,b[100010],sum[100010];
bool check(double k){
for(int i=1;i<=n;i++) b[i]=a[i]-k;
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
int l=1,r=0;
for(int i=1;i<=n;i++){
if(i>=s){
while(r>=l&&sum[i-s]<sum[q[r]]) r--;
q[++r]=i-s;
}
if(l<=r&&q[l]<i-t) l++;
if(l<=r&&sum[i]>=sum[q[l]]) return 1;
}
return 0;
}
int main(){
scanf("%d%d%d",&n,&s,&t);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
mid=(l+r)/2;
while(r-l>1e-4){
if(check(mid)) l=mid;
else r=mid;
mid=(l+r)/2;
}
printf("%.3lf",mid);
return 0;
}