HDU 5753

本文介绍了一个数学期望计算问题:对于给定的整数n和n个非负数c[], 若存在1到n的排列使得每个位置上的数值大于其相邻的两个数(首尾视为0),则该位置上的c[i]加入总和sum中。文章通过分析得出两端位置的数对sum的贡献概率为1/2,中间位置为1/3,并给出了一段C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给定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 }

 

转载于:https://www.cnblogs.com/xFANx/p/7259538.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值