zoukankan      html  css  js  c++  java
  • gym1016231E

    题意

    给定(n,g,t)及序列({c_i:1le ile n})
    (n)张桌子,每张可容纳的人数为(c_i)
    (t)群人来吃饭,每群人数为([1,g])中随机的一个整数(x),会选一张最小的能容纳(x)个人的桌子坐下(若没有则离开)
    求最后的期望人数
    (n,tle 100)(g,c_ile 200)

    做法

    假设(c_1le c_2le cdotsle c_nle g)

    考虑观察题目的性质:

    • 最后就坐的桌子,是若干段连续的区间
    • 若目前的一群人(x)人就坐,之前(le x)的人数的群体一定也就坐了

    (f_{l,r})为前(r-l+1)群人,恰好就坐([l,r])的概率,枚举最后一群人就坐的位置,转移显然:

    [egin{cases} f_{i,i-1}=1\ f_{l,r}=sumlimits_{k=l}^{r} frac{c_k-c_{l-1}}{g}{r-lchoose r-k}f_{l,k-1}f_{k+1,r} end{cases}]

    (g_{i,j})为前(j)群人,在([1,i))就坐的概率
    转移利用(f),枚举与(i-1)在一段的数量(可能为(0)),转移显然:

    [egin{cases} g_{0,0}=1\ g_{i,j}=sumlimits_{len=0}^j {jchoose len}f_{i-len,i-1}cdot g_{i-len-1,j-len} end{cases}]

    根据期望的线性性,计算每一张桌子(i)的贡献:

    [sumlimits_{k=1}^{min(i,t)} sumlimits_{j=1,i-j+1le k}^i (frac{1}{g}sumlimits_{x=c_{j-1}+1}^{c_i}x)f_{j,i-1}cdot g_{j-1,k-(i-j+1)}sumlimits_{num=k}^{t}{tchoose num}{k-1choose i-j}(1-frac{c_i}{g})^{t-num}(frac{c_i}{g})^{num-k} ]

    枚举在第(i)张桌子就坐后的这一刻,([1,i])(k)张桌子已经有人
    枚举就坐后的这一刻,(i)这一极长段是以(j)开始的
    枚举总共有(num)(le c_i)的人群

    这样做单次是(O(n^3))的,观察最后那个(sum),稍加变形就很容易做到单次(O(n^2))了:

    [egin{aligned} {k-1choose i-j}(frac{c_i}{g})^{-k}sumlimits_{num=k}^{t}{tchoose num}(1-frac{c_i}{g})^{t-num}(frac{c_i}{g})^{num}\ end{aligned}]

    总复杂度(O(n^3)),但实测(O(n^4))跑得飞快

  • 相关阅读:
    python常见的错误异常
    vim命令c编程
    递归函数初步理解---python实现(汉诺塔问题)
    python报错:AttributeError: module 'pdb' has no attribute 'set_trace'
    python程序控制结构
    python函数
    结构体的四种定义方法
    基于一维数组的桶排序入门
    双链表与单链表的比较
    在用free()函数释放指针内存时为何要将其指针置空
  • 原文地址:https://www.cnblogs.com/Grice/p/14426099.html
Copyright © 2011-2022 走看看