把一个序列每种情况考虑一遍明显是不可能的。。。。
所以把每个数的数学期望抽出来算
对于在1~n两端的数来说,它出现1的概率为:
其中取1~n中两个数,这两个数一定一个大一个小,因此直有一种情况,剩下的其他位置全排列,除以总可能数。化简为1/2
对于2~n-1位置的数来说,他们出现1的概率为:
该式的意义为在1~n中取3个数字,三个数字要呈现中间大于两边的数的情况,因此两边的两个数字可以交换,所以有两种情况。剩下的n-3个数字全排列,再除以所有可能情况。化简为1/3
接下来题解就很简单了,首位两书*1/2,中间的数字*1/3
当n==1的时候要特判一下
下面是代码:
#include <iostream>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const int maxn=1005;
double save[maxn];
int main(){
int i,n;
while(cin>>n){
for(i=1;i<=n;i++){
cin>>save[i];
}
if(n==1){
cout<<save[1]<<endl;
}else{
double side,middle=0;
side=save[1]+save[n];
for(i=2;i<n;i++){
middle=middle+save[i];
}
printf("%.6lf\n",middle/3+side/2);
}
}
return 0;
}