题意
给定\(n,g,t\)及序列\(\{c_i:1\le i\le n\}\)
有\(n\)张桌子,每张可容纳的人数为\(c_i\)
有\(t\)群人来吃饭,每群人数为\([1,g]\)中随机的一个整数\(x\),会选一张最小的能容纳\(x\)个人的桌子坐下(若没有则离开)
求最后的期望人数
\(n,t\le 100\),\(g,c_i\le 200\)
做法
假设\(c_1\le c_2\le \cdots\le c_n\le g\)
考虑观察题目的性质:
- 最后就坐的桌子,是若干段连续的区间
- 若目前的一群人\(x\)人就坐,之前\(\le x\)的人数的群体一定也就坐了
令\(f_{l,r}\)为前\(r-l+1\)群人,恰好就坐\([l,r]\)的概率,枚举最后一群人就坐的位置,转移显然:
令\(g_{i,j}\)为前\(j\)群人,在\([1,i)\)就坐的概率
转移利用\(f\),枚举与\(i-1\)在一段的数量(可能为\(0\)),转移显然:
根据期望的线性性,计算每一张桌子\(i\)的贡献:
枚举在第\(i\)张桌子就坐后的这一刻,\([1,i]\)有\(k\)张桌子已经有人
枚举就坐后的这一刻,\(i\)这一极长段是以\(j\)开始的
枚举总共有\(num\)个\(\le c_i\)的人群
这样做单次是\(O(n^3)\)的,观察最后那个\(\sum\),稍加变形就很容易做到单次\(O(n^2)\)了:
总复杂度\(O(n^3)\),但实测\(O(n^4)\)跑得飞快
© 著作权归作者所有
发表评论