𝘛𝘰 𝘣𝘦 𝘢 𝘳𝘰𝘤𝘬, |

园龄:粉丝:关注:

「shoi 2012」随机数

link.

对于 pass 1, 你把他考虑成 xi 的形式, 于是每次操作的贡献就是 2i, 那么答案就是 i=2n2i.

对于 pass 2, 首先由全概率公式 E(n)=i=0P(ni). 那么我们考虑固定 k=i, 求出 P(nk). 其实直接求这个有点麻烦, 强化一下条件, 我们求 P(n=k), 最后后缀和即可取得 P(nk).

f(i,j) 表示共 i 个叶结点, 树深度为 j 时的概率. 对于二叉树我们有一种经典的考虑子结构的方式, 即考虑左子树的信息. 对于此题, 我们考虑左子树 (相对于根结点来说) 的叶结点数量 k. 那么有 f(i,max{k,l}+1)f(i,max{k,l}+1)+f(j,k)×f(ij,l)i1. 其中 i 为全树的叶子个数, k, l 分别为左, 右子树的深度, j 为左子树的叶结点个数. 1i1 是对于一个有 i 个叶子的二叉树, 有 k 个结点在左子树的概率, which 与 k 无关. 至于为什么是 1i1, 你考虑操作次数为 i1 即可.

#include <bits/stdc++.h>
using namespace std;
typedef double db;
int Q, N;
db f[200][200];
signed main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> Q >> N;
  cout << fixed;
  cout << setprecision(6);
  if (Q == 1) {
    db ans = 0;
    for (int i = 2; i <= N; ++i) {
      ans += 2.0 / i;
    }
    cout << ans << "\n";
  } else if (Q == 2) {
    f[1][0] = f[2][1] = f[3][2] = 1;
    for (int i = 4; i <= N; ++i) {
      for (int j = 1; j < i; ++j) {
        for (int k = 0; k < j; ++k) {
          for (int l = 0; l < i - j; ++l) {
            f[i][max(k, l) + 1] += f[j][k] * f[i - j][l] / (i - 1);
          }
        }
      }
    }
    db ans = 0;
    for (int i = N; i >= 1; --i) {
      f[N][i] += f[N][i + 1];
    }
    for (int i = 1; i < N; ++i) {
      ans += f[N][i];
    }
    cout << ans << "\n";
  }
  return 0;
}

本文作者:𝒸𝒾𝓇𝓃ℴ𝓋𝓈𝓀𝓎

本文链接:https://www.cnblogs.com/orchid-any/p/16180749.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   cirnovsky  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.