题意:h为1~n的一个排列,若hi大于左右两边的值,f+=ci。问f的期望。
思路:对每个ci求可能出现的次数xi,结果就为sum(ci*xi)/n!。公式如下
我的字好丑啊。。
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<sstream>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
double an2(int x){
return x*(x-1);
}
int main(){
// freopen("input.txt","r",stdin);
int n,C[1005];
while(cin>>n){
for(int i=1;i<=n;i++){
scanf("%d",&C[i]);
}
if(n==1){
printf("%d\n",C[1]);
continue;
}
double head=0,mid=0;
head=(double)n*(n-1)/2;
if(n==2){
printf("%.6f\n",(double)(head*C[1]+head*C[2])/n/(n-1));
continue;
}
head*=(n-2);
for(int i=2;i<=n-1;i++){
mid+=an2(i);
}
double ans=0;
ans+=head*C[1];
for(int i=2;i<=n-1;i++){
ans+=mid*C[i];
}
ans+=head*C[n];
printf("%.6f\n",(double)ans/n/(n-1)/(n-2));
}
return 0;
}