#include <iostream>
using namespace std;
int c[1005];
int main(){
int n;
while(~scanf("%d",&n)){
double ex=0;
for(int i=0;i<n;i++){
scanf("%d",&c[i]);
}
ex=c[0]/2.0+c[n-1]/2.0;
for (int i=1;i<n-1;i++){
ex+=(c[i]/3.0);
}
printf("%.6lf\n",ex);
}
}
这一题主要需要分清题意。
0 h1~hn 0序列 h1~hn任意排列组合 如果满足hi>hi+1 hi>hi-1 则该处对应的c*1 反之c*0 计算f(h)的期望;
如果一个一个计算情况和概率会很麻烦 并且如果对结果没贡献时ci为0 所以只考虑有对结果有贡献的情况;
考虑两端 位置有贡献的情况 从n个数里选2个 并且只有一种排列方法 剩下(n-2)全排列 除以n个数的全排列 所以ci*C(2,n)*A(n-2,n-2)/A(n,n)=ci/2;
考虑中间 位置有贡献的情况 从n个数里选3个 并且有两种排列方法 剩下(n-3)全排列 除以n个数的全排列 所以ci*C(3,n)*A(n-3,n-3)/A(n,n)=ci/3;
然后ci不同贡献累加即为结果;