CodeForces - 28C Bath Queue 概率与期望
我概率期望真是垃圾……,这题搞了两个钟头……
题意
有\(n\)个人,\(m\)个浴室,每个浴室里有\(a_i\)个浴缸。每个人会等概率随机选择一个浴室,然后每个浴室中尽量平分到每个浴缸。问期望最长排队队伍长度是多少?
解题思路
我看网上的题解都是直接\(DP\)期望,然而本蒟蒻看不懂那个递推式是什么鬼……有没有\(dalao\)来解释一下啊……
付一下别人的题解,摘自https://www.cnblogs.com/LzyRapx/p/7692702.html
用状态$ dp[i][j][k] \(表示还剩\) i$ 间浴室,还剩 \(j\) 个人,之前最长队伍的长度为 \(k\) 的期望最长队伍长度。
那么状态转移方程为:
(i−1)^{j−c}/i^j \times (j,c))
\]
其中 \(c\) 是枚举当前去第 \(j\) 间浴室的人数。
那么答案就是$ dp[m][n][0]$ 。
----伪分割线----
下面是我自己的概率做法。
我们令\(dp[i][j][k]\)表示已经选了\(i\)个浴室,还剩\(j\)个人,最长长度为\(k\)的概率。注意下标意义的定义与上面的不一样。
那么我们可以得到状态转移方程:
\]
这里感谢\(PSCdalao\)帮我斧正这个方程,并阐述了为什么是除以\(m^c\)。
下面我们解释这个方程的意义。
现在在状态\(dp[i][j][k]\),那么我们可以从剩下\(j\)个人中,选出\(c\)个。这时候下标就变为了\(dp[i+1][j-c][max(k, \frac{c+a[i+1]-1}{a[i+1]})]\)。而从前一个状态转到这一个方案的概率就是\({j \choose c} / m^c\)(从\(j\)个人中选\(c\)个,而这\(c\)个人本来可以有\(m^c\)种选法)。我们再来仔细看一下为什么是\(m^c\)而不是\((m-i)^c\)。
我们把n个人分到m个澡堂的某种分法的概率应当为
\]
然后我们拆开分别乘在每一步中,就成了
\]
所以就有方程中的“\(/m^c\)”。
同时,我们可以看出,我们同样可以先求出方案数,最后再除以\(m^c\)。(感谢\(DYTdalao\)提供这个好主意)
到这里,我们求出了概率。最后把每一个概率乘以长度,累加就好了。
不要问我精度问题,反正全部开\(double\),然后什么都不管就可以了QwQ
参考程序
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn = 60;
int n, m, a[ Maxn ];
double dp[ Maxn ][ Maxn ][ Maxn ], C[ 60 ][ 60 ];
double Power( double x, int y ) {
if( y == 0 ) return 1.0;
double t = Power( x, y / 2 );
t = t * t;
if( y % 2 == 1 ) t = t * x;
return t;
}
void init() {
memset( C, 0, sizeof( C ) );
C[ 0 ][ 0 ] = 1.0;
for( int i = 1; i <= 50; ++i ) {
C[ i ][ 0 ] = 1.0;
for( int j = 1; j <= i; ++j ) C[ i ][ j ] = C[ i - 1 ][ j - 1 ] + C[ i - 1 ][ j ];
}
return;
}
int main() {
init();
memset( dp, 0, sizeof( dp ) );
scanf( "%d%d", &n, &m );
dp[ 0 ][ n ][ 0 ] = 1.0;
for( int i = 1; i <= m; ++i ) scanf( "%d", &a[ i ] );
for( int i = 0; i < m - 1; ++i )
for( int j = 0; j <= n; ++j )
for( int k = 0; k <= n; ++k )
for( int c = 0; c <= j; ++c )
dp[ i + 1 ][ j - c ][ max( k, ( c + a[ i + 1 ] - 1 ) / a[ i + 1 ] ) ] +=
dp[ i ][ j ][ k ] * C[ j ][ c ] / Power( m * 1.0, c );
for( int j = 0; j <= n; ++j )
for( int k = 0; k <= n; ++k )
dp[ m ][ 0 ][ max( k, ( j + a[ m ] - 1 ) / a[ m ] ) ] += dp[ m - 1 ][ j ][ k ] * 1.0 / Power( m * 1.0, j );
double ans;
for( int i = 0; i <= n; ++i )
ans += i * dp[ m ][ 0 ][ i ];
printf( "%.10lf\n", ans );
return 0;
}
CodeForces - 28C Bath Queue 概率与期望的更多相关文章
- Codeforces 28C Bath Queue 【计数类DP】*
Codeforces 28C Bath Queue LINK 简要题意:有 n 个人等概率随机进入 m 个房间,一个房间可以有多个人,第 i 个房间有 ai 个水龙头,在一个房间的人要去排队装水,他们 ...
- Codeforces #28 C.Bath Queue (概率dp)
Codeforces Beta Round #28 (Codeforces format) 题目链接: http://codeforces.com/contest/28/problem/C 题意: 有 ...
- Codeforces 1009E Intercity Travelling | 概率与期望
题目链接 题目大意: 一个人要从$A$地前往$B$地,两地相距$N$千米,$A$地在第$0$千米处,$B$地在第$N$千米处. 从$A$地开始,每隔$1$千米都有$\dfrac{1}{2}$的概率拥有 ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- 概率及期望DP小结
资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
- 【BZOJ-3450】Tyvj1952Easy 概率与期望DP
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 468 Solved: 353[Submit][Status] ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
- BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望
BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...
随机推荐
- java-selenium三种等待方式
方式1: 线程等待:Thread.sleep(xxxx) 只要在case中加入sleep就会强制等待设置的时间后才会执行之后的命令,这种等待一般适用于调试脚本的时候. java代码 //等待3秒 Th ...
- python基础数据类型和初级应用
1.整数: int -- 计算和比较 2 -- 10 推位 8421 20 21 -- 2**7 10 - 2 bit_length 二进制的有效占用位数 # 123 # 计算和比较 # 14 0 # ...
- 使用Python基于OpenCV和Tesseract的OCR
OCR OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形 ...
- leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1-> ...
- node工具之pm2
pm2 PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器.它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务. 安装 npm install p ...
- Java后端技术面试汇总(第五套)
1.Java相关 • 乐观悲观锁的设计,如何保证原子性,解决的问题:• char和double的字节,以及在内存的分布是怎样:• 对象内存布局,然后讲下对象的死亡过程?• 对象头,详细讲下:• syn ...
- 第五章 表表达式 T-SQL语言基础
表表达式 Microsoft SQL Server支持4种类型的表表达式:派生表(derived table),公用表表达式(CTE,common table expression),视图,以及内联表 ...
- 移动端H5开发自适应技巧
移动端H5开发,必要要做到自适应各种分辨率的手机,下面由我为大家大致说一下,需要3步走 第一:head标签中添加: <meta name="viewport" content ...
- axios+FormData文件上传
axios+FormData文件上传 原理:FormData上传 创建一个FormData对象,将得到的文件流对象放在FormData内,然后使用axios上传 注意: 1.请求头设置 headers ...
- JS根据一个经纬度及距离角度,算出另外一个经纬度
var mapNumberUtil = {}; /** * 根据一个经纬度及距离角度,算出另外一个经纬度 * @param {*} lng 经度 113.3960698 * @param {*} la ...