题解--P8424 [JOI Open 2022] 跷跷板(Seesaw)
首先,我们可以发现无论如何操作,箱子一定包含初始的
考虑
我们需要先求出第
容易发现,我们每一步一定取这两个区间之一,否则往
考虑答案为最大的选取
我们接下来说明答案能取到。考虑这个移动的过程,如果当前我们位于
于是,我们只需要按照
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read() {
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
namespace tokidosaya {
#define fi first
#define sc second
typedef pair<double,double> pi;
const int maxn=2e5+5;
int n,a[maxn];
ll s[maxn];
pi p[maxn];
int main() {
n=read();
for(int i=1; i<=n; i++)a[i]=read(),s[i]=s[i-1]+a[i];
double mid=1.0*s[n]/n;
int l=1,r=n;
for(int i=1; i<n; i++) {
l++;
if(1.0*(s[r]-s[l-1])/(r-l+1)>mid)l--,r--;
p[i]=pi(mid-1.0*(s[r]-s[l-1])/(r-l+1),1.0*(s[r+1]-s[l])/(r-l+1)-mid);
}
sort(p+1,p+n);
double ans=1e9,suf=0;
for(int i=n-1; i; i--)ans=min(ans,p[i].fi+suf),suf=max(suf,p[i].sc);
printf("%.10lf",ans);
return 0;
}
}
int main() {
return tokidosaya::main();
}