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))跑得飞快

  • 相关阅读:
    八. 输入输出(IO)操作2.面向字符的输入流
    八. 输入输出(IO)操作1.输入输出基本概念
    七. 多线程编程11.线程的挂起、恢复和终止
    七. 多线程编程10.线程死锁
    nginx 配置身份验证 http_auth_basic_module
    liunx mysql 备份
    8080 端口只允许内网访问配置
    nginx 配置白名单
    liunx tomcat 运行模式apr
    liunx contos 7.4 安装redis集群
  • 原文地址:https://www.cnblogs.com/Grice/p/14426099.html
Copyright © 2011-2022 走看看