LightOJ 1248 Dice (III) (期望DP / 几何分布)
题目链接:LightOJ - 1248
Description
Given a dice with n sides, you have to find the expected number of times you have to throw that dice to see all its faces at least once. Assume that the dice is fair, that means when you throw the dice, the probability of occurring any face is equal.
For example, for a fair two sided coin, the result is 3. Because when you first throw the coin, you will definitely see a new face. If you throw the coin again, the chance of getting the opposite side is 0.5, and the chance of getting the same side is 0.5. So, the result is
\(1 + (1 + 0.5 * (1 + 0.5 * ...))\)
\(= 2 + 0.5 + 0.5^2 + 0.5^3 + ...\)
\(= 2 + 1 = 3\)
Input
Input starts with an integer \(T (≤ 100)\), denoting the number of test cases.
Each case starts with a line containing an integer \(n (1 ≤ n ≤ 10^5)\).
Output
For each case, print the case number and the expected number of times you have to throw the dice to see all its faces at least once. Errors less than \(10^{-6}\) will be ignored.
Sample Input
5
1
2
3
6
100
Sample Output
Case 1: 1
Case 2: 3
Case 3: 5.5
Case 4: 14.7
Case 5: 518.7377517640
Solution
题意
给定一个 \(n\) 面的骰子,每个面出现的概率相同,现在要所有的面都至少出现一次,求投掷次数的期望。
思路
期望DP
期望DP一般是倒推的。
设 \(dp[i]\) 为已经出现了 \(i\) 个面,还需要投掷次数的期望值。
那么每次投掷只有两种情况:出现已经出现过的面、出现未出现的面。前者概率为 \(\frac{i}{n}\),后者概率为 \(\frac{n - i}{n}\)。
则状态转移方程为 \(dp[i] = (dp[i] + 1) * \frac{i}{n} + (dp[i + 1] + 1) * \frac{n - i}{n}\)
化简得 \(dp[i] = dp[i + 1] + \frac{n}{n - i}\)
\(dp[n] = 0\),倒推即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
double dp[maxn];
int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
memset(dp, 0, sizeof(dp));
int n;
scanf("%d", &n);
dp[n] = 0;
for(int i = n - 1; i >= 0; --i) {
dp[i] = dp[i + 1] + 1.0 * n / (n - i);
}
printf("Case %d: %.10lf\n", ++kase, dp[0]);
}
return 0;
}
其实是满足几何分布的。
第一个出现的面可以是 \(1, 2, 3, ..., n\),有 \(n\) 个。
如果第一个出现的面是 \(1\),那么第二个出现的面可以是 \(2, 3, ..., n\),有 \(n - 1\) 个。
...
第一个面第一次出现的概率为 \(p_1 = \frac{n}{n}\)
第二个面第一次出现的概率为 \(p_2 = \frac{n - 1}{n}\)
第三个面第一次出现的概率为 \(p_3 = \frac{n - 2}{n}\)
...
第 \(i\) 个面第一次出现的概率为 \(p_i = \frac{n - i + 1}{n}\)
几何分布的期望 \(E(X) = \frac{1}{p}\)
所以所有面至少出现一次的期望为 \(\sum_{i=1}^n \frac{1}{p_i} = \sum_{i=1}^n \frac{n}{n - i + 1}\)。
注:几何分布指在 \(n\) 次伯努利试验中,试验 \(k\) 次才得到第一次成功的机率。
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
int n;
scanf("%d", &n);
double ans = 0.0;
for(int i = 1; i <= n; ++i) {
ans += n * 1.0 / i;
}
printf("Case %d: %.10lf\n", ++kase, ans);
}
return 0;
}
Reference
LightOJ 1248 Dice (III) (期望DP / 几何分布)的更多相关文章
- LightOJ - 1248 Dice (III) —— 期望
题目链接:https://vjudge.net/problem/LightOJ-1248 1248 - Dice (III) PDF (English) Statistics Forum Tim ...
- LightOj 1248 - Dice (III)(几何分布+期望)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1248 题意:有一个 n 面的骰子,问至少看到所有的面一次的所需 掷骰子 的 次数的期望 ...
- LightOJ 1248 Dice (III) (水题,期望DP)
题意:给出一个n面的色子,问看到每个面的投掷次数期望是多少. 析:这个题很水啊,就是他解释样例解释的太...我鄙视他,,,,, dp[i] 表示 已经看到 i 面的期望是多少,然后两种选择一种是看到新 ...
- 【非原创】LightOj 1248 - Dice (III)【几何分布+期望】
学习博客:戳这里 题意:有一个 n 面的骰子,问至少看到所有的面一次的所需 掷骰子 的 次数的期望: 第一个面第一次出现的概率是p1 n/n; 第二个面第一次出现的概率是p2 (n-1)/n; 第三个 ...
- LightOJ 1248 Dice (III) 概率
Description Given a dice with n sides, you have to find the expected number of times you have to thr ...
- LightOJ 1248 Dice (III)
期望,$dp$. 设$dp[i]$表示当前已经出现过$i$个数字的期望次数.在这种状态下,如果再投一次,会出现两种可能,即出现了$i+1$个数字以及还是$i$个数字. 因此 $dp[i]=dp[i]* ...
- 1248 - Dice (III)
1248 - Dice (III) PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB Given ...
- [LOJ 1248] Dice (III)
G - Dice (III) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Descri ...
- lightoj 1248-G - Dice (III) (概率dp)
题意:给你n个面的骰子,问扔出所有面的期望次数. 虽然这题挺简单的但还是要提一下.这题题目给出了解法. E(m)表示得到m个不同面的期望次数. E(m+1)=[((n-m)/n)*E(m)+1]+(m ...
随机推荐
- Java执行static顺序
1.定义: 1. Java中静态变量只能在类主体中定义,不能在方法中定义. 静态变量属于类所有而不属于方法. 2. 静态块:用static申明,JVM加载类时执行,仅执行一次 构造块:类中 ...
- 洛谷P1219 八皇后
题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...
- urllib库爬取实例
from urllib import request import random def spider(url): user_agent_list = [ "Mozilla/5.0 (Win ...
- 洛谷 P1522 牛的旅行 Cow Tours——暴力枚举+最短路
先上一波题目 https://www.luogu.org/problem/P1522 这道题其实就是给你几个相互独立的连通图 问找一条新的路把其中的两个连通图连接起来后使得新的图中距离最远的两个点之 ...
- linux查看日志中特定字符串以及前后信息内容命令
在项目实施过程中,我们经常会查看日志,更是经常会根据某些特地字符串去查找日志内容. 下面就是日志查找命令: 1.查询字符串命令: cat fileName|grep '要查找的字符串' 实例:cat ...
- Jquery中input:type=radio的监听,获取设置值
一.html <div id='demo'> <input type='radio' name='sex' value='男' > <input type='radio' ...
- PHPStorm remoteHost链接FTP成功,但不显示文件目录
============================================== 勾上前两个选项就可以了
- 58.Partition Equal Subset Sum(判断一个数组是否可以分成和相等的两个数组)
Level: Medium 题目描述: Given a non-empty array containing only positive integers, find if the array c ...
- etcd扩展使用
etcd我已经提到很多次了,前面的可以自己查看.v3版本改用grpc接口,很简单,非常简单,易上手易学习. etcd有集群部署方式,那么就涉及部署的地址,可以动态添加部署节点,这样再应用中不可能都去关 ...
- shell选项和参数