LightOJ 1248 Dice (III)
题意#
有一个 n 面的骰子,每次投掷每个面都是等概率出现,求所有面都出现的期望投掷次数。
思路#
我们进行一个状态定义:f[i] 表示已经出现了 i 个不同的面的期望,那么我们考虑 f[i] 可以由谁转移过来?
显然我们每次投掷最多只会出现一个面,这个面有两种情况,第一种为出现过的,第二种为没出现过的
那么 f[i] 有 in 的概率由出现过的面转移而来, 有 n−in 的概率从未出现的面转移过来,并且无论从哪里来,期望次数都会比原来多 1
即f[i]=in×f[i]+n−in×f[i−1]+1 移项可得 f[i]=f[i−1]+nn−i
点击查看代码
/********************
Author: Nanfeng1997
Contest: LightOJ
URL: https://lightoj.com/problem/dice-iii
When: 2022-03-22 14:46:47
Memory: 64MB
Time: 1000ms
********************/
#include <bits/stdc++.h>
#define _ 0
using namespace std;
using LL = long long;
double dp[100010];
void solve(int T) {
int n; cin >> n;
dp[1] = 1;
for(int i = 2; i <= n; i ++ ) {
dp[i] = dp[i - 1] + 1.0 * n / (i - 1);
}
printf("Case %d: %.10f\n", T, dp[n]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1, r = 0; cin >> T;
while(T --) solve(++ r);
return ~~(0 ^ _ ^ 0);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步