题意
给定n,和n个非负数c[]
若有1~n的排列满足该位置上数的值比左右两端大(h[0] = h[n + 1] = 0),将该位置上的c[i]添加到sum上。
求sum的数学期望
我一开始是按分处于两端和中间考虑,去算对sum有贡献的概率。算出两段的是1/2后,思考中间的发现,其实你只需要关注一个数与其周围的两个数即可,其他位置数的排列并不影响概率。所以两端的概率是1/2,中间是1/3.
1 #include <cstdio> 2 #define Yes printf("YES ") 3 #define No printf("NO ") 4 using namespace std; 5 6 const int maxn = 1e3 + 10; 7 int n; 8 int a[maxn]; 9 10 11 int main(int argc, const char * argv[]) { 12 while (~scanf("%d", &n)) { 13 for (int i = 0; i < n; i++) { 14 scanf("%d", &a[i]); 15 } 16 double ans = 0.0; 17 for (int i = 1; i < n - 1; i++) { 18 ans += (1.0 / 3.0) * (double)a[i]; 19 } 20 ans += (0.5 * a[0]) + (0.5 * a[n - 1]); 21 printf("%.6lf ", ans); 22 } 23 return 0; 24 }