HDU 5753

题意

给定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\n")
 3 #define No printf("NO\n")
 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\n", ans);
22     }
23     return 0;
24 }

 

posted @ 2017-07-30 16:37  xFANx  阅读(118)  评论(0编辑  收藏  举报