官方题解:根据期望的线性性,我们可以分开考虑每个位置对答案的贡献。
可以发现当ii不在两边的时候和两端有六种大小关系,其中有两种是对答案有贡献的。
那么对答案的贡献就是ci/3
在两端的话有两种大小关系,其中有一种对答案有贡献。
那么对答案的贡献就是ci/2
复杂度是O(n)O(n)。
注意特判n=1的情况。
一开始并没有思路,列出了1—5的情况,发现了规律,c[i]的贡献次数,有规律可循,3的时候是3 2 3,4的时候是12 8 8 12,5的时候是60 40 40 40 60,再分别除以n!,答案也是1/3*c[0]+1/2*(c[1]……c[n-1])+1/3*c[n];
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
double c[1005];
while(cin>>n)
{
double sum=0.0;
for(int i=0;i<n;i++)
scanf("%lf",&c[i]);
if(n==1)
printf("%.6lf\n",c[0]);
else if(n==2)
printf("%.6lf\n",(c[0]+c[1])/2);
else
{
sum+=1.0*c[0]/2;
for(int i=1;i<n-1;i++)
{
sum+=1.0/3*c[i];
}
sum+=1.0*c[n-1]/2;
printf("%.6lf\n",sum);
}
}
return 0;
}