Tsinsen-A1489 抽奖 【数学期望】
2015-12-07 19:32
309 查看
乔明达太神,其实已经题解非常清楚了,我再推一遍吧。
题目意思相当于有n个盒子,无差别投m次球,每个盒子的得分为每个盒子里的球的个数。
第一问:
假设这个球放在了第i个盒子里,那么 ∆ans = (mi + 1) ^ 2 - mi ^ 2 --> ∆ans = 2mi + 1
同时取期望 --> E(∆i) = 2E(∆mi) + 1
i这个盒子有mi个球(假设已经投出了t个球)的期望为 t * pi 代入 E(∆i) = 2 * t * pi + 1
特殊到一般,对于任意的i,i = 当前这个选定的i 的概率为pi,那么 E(∆) = sigma(pi * E(∆i)),代入,E(∆) = sigma(2 * t * pi ^ 2 + pi) = 1 + 2 * t * sigma(pi ^ 2).
那么对于T = [0, m - 1],求和即可,ans = sigma(1 + 2 * t * sigma(pi ^ 2)),ans = m + m * (m - 1) * sigma(pi ^ 2).
第二问:
对于一个人,我们考虑他的是否中奖情况,将其定义为ci,ci 若为1则中奖,否则没有。那么答案为E(sigma(ci)) = sigma(E(ci)).
E(ci) 为一个人中奖的概率,E(ci) = 1 - (1 - pi) ^ m.
View Code
题目意思相当于有n个盒子,无差别投m次球,每个盒子的得分为每个盒子里的球的个数。
第一问:
假设这个球放在了第i个盒子里,那么 ∆ans = (mi + 1) ^ 2 - mi ^ 2 --> ∆ans = 2mi + 1
同时取期望 --> E(∆i) = 2E(∆mi) + 1
i这个盒子有mi个球(假设已经投出了t个球)的期望为 t * pi 代入 E(∆i) = 2 * t * pi + 1
特殊到一般,对于任意的i,i = 当前这个选定的i 的概率为pi,那么 E(∆) = sigma(pi * E(∆i)),代入,E(∆) = sigma(2 * t * pi ^ 2 + pi) = 1 + 2 * t * sigma(pi ^ 2).
那么对于T = [0, m - 1],求和即可,ans = sigma(1 + 2 * t * sigma(pi ^ 2)),ans = m + m * (m - 1) * sigma(pi ^ 2).
第二问:
对于一个人,我们考虑他的是否中奖情况,将其定义为ci,ci 若为1则中奖,否则没有。那么答案为E(sigma(ci)) = sigma(E(ci)).
E(ci) 为一个人中奖的概率,E(ci) = 1 - (1 - pi) ^ m.
#include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define drep(i, a, b) for (int i = a; i >= b; i--) #define REP(i, a, b) for (int i = a; i < b; i++) #define mp make_pair #define pb push_back #define clr(x) memset(x, 0, sizeof(x)) #define xx first #define yy second using namespace std; typedef long long i64; typedef pair<int, int> pii; const int inf = ~0U >> 1; const i64 INF = ~0ULL >> 1; //******************************* const int maxn = 100005; int c[maxn]; double Pow(double base, int num) { double ret = 1; while (num) { if (num & 1) ret *= base; base *= base; num >>= 1; } return ret; } int main() { int n, m; scanf("%d%d", &n, &m); i64 sum(0); rep(i, 1, n) scanf("%d", &c[i]), sum += c[i]; double ans1(0); static double p[maxn]; rep(i, 1, n) p[i] = 1.0 * c[i] / sum; rep(i, 1, n) ans1 += p[i] * p[i]; ans1 *= m; ans1 *= m - 1; ans1 += m; printf("%.2lf\n", ans1); double ans2 = n; rep(i, 1, n) ans2 -= Pow(1.0 - 1.0 * p[i], m); printf("%.2lf\n", ans2); return 0; }
View Code
相关文章推荐
- 查看virsh管理qemu虚拟机日志信息和libvirtd日志信息
- 【SSH项目实战】国税协同平台-4.用户管理需求分析&CRUD方法2
- uva111(dp)
- Longest Valid Parentheses
- iptables 状态策略 允许内网连接外网 拒绝外网主动连入内网 _ 笔记
- cf(420A)
- 关于微信接口
- UI控件
- css sprites-简单实例让你快速掌握css sprites精髓
- MySQL下查询锁信息
- 【SSH项目实战】国税协同平台-4.用户管理需求分析&CRUD方法1
- cocos2d对动画的各种操作
- 【SSH项目实战】国税协同平台-3.资源文件分类&log4j&抽取BaseAction
- ROC(Receiver Operating Characteristic)曲线简介
- 关于opencv中的imread()函数声明
- 地震数据SEGY格式介绍及其查看分析(附示例地震数据)
- java集合类
- iOS App Icon图标 尺寸规范
- VMware虚拟机主机模式上网问题
- LIS (最长上升字序列) nlgn 解法