LightOJ 1248 Dice (III)

传送门

题意

有一个 \(n\) 面的骰子,每次投掷每个面都是等概率出现,求所有面都出现的期望投掷次数。

思路

我们进行一个状态定义:\(f[i]\) 表示已经出现了 \(i\) 个不同的面的期望,那么我们考虑 \(f[i]\) 可以由谁转移过来?
显然我们每次投掷最多只会出现一个面,这个面有两种情况,第一种为出现过的,第二种为没出现过的
那么 \(f[i]\)\(\frac{i}{n}\) 的概率由出现过的面转移而来, 有 \(\frac{n-i}{n}\) 的概率从未出现的面转移过来,并且无论从哪里来,期望次数都会比原来多 \(1\)
\(f[i] = \frac{i}{n} \times f[i] + \frac{n-i}{n} \times f[i-1] + 1\) 移项可得 \(f[i] = f[i-1] + \frac{n}{n-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);
}

posted @ 2022-03-22 15:07  ccz9729  阅读(32)  评论(0编辑  收藏  举报