题目描述:
题目分析:
管它上面是什么东西,反正只需要关心它的重心和最右边的距离。
设
f
[
i
]
f[i]
f[i]表示块
[
i
,
n
]
[i,n]
[i,n]的重心与右边界的最远距离。
考虑
[
i
+
1
,
n
]
[i+1,n]
[i+1,n]叠到第
i
i
i块上来,要么是上面的最右边作为新的最右边,上面的重心在第
i
i
i块的右边界时,新重心离右边最远;要么是第
i
i
i块的最右边作为新的最右边,上面的重心在第
i
i
i块的左边界时,新重心离右边最远。
于是就可以做题了,研究一下式子可以发现最多有一个转折点。
Code:
#include<bits/stdc++.h>
#define maxn 300005
using namespace std;
int n;
long long s[maxn];
double f[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&s[i]),s[i]+=s[i-1];
f[n]=1;
for(int i=n-1;i>1;i--){
double t=1.0*(s[n]-s[i])/(s[n]-s[i-1]);
f[i]=max(1-t+f[i+1],t+1);
}
printf("%.8f\n",f[2]);
}