题面传送门

期望真 nm 有意思,所以蒟蒻又来颓期望辣

先特判掉 \(P_0=0\) 的情况,下面假设 \(P_0\ne 0\)。

首先注意到我们每次将加特林对准一个人,如果这个人被毙掉了,那么相当于进入了 \(n-1\) 个人的状态,否则等价于每个人都向前移动了一个位置,原来第 \(k\) 个位置上的人挪到了第 \(k-1\) 个位置上,故我们考虑设 \(dp_{i,j}\) 表示在有 \(i\) 个人的状态下,第 \(j\) 个人成为唯一的幸存者的概率。考虑转移,这里不妨假设 \(j>2\),考虑第一个人是否被毙掉,如果被毙掉了那么相当于 \(i-1\) 个人中第 \(j-1\) 个人成为唯一幸存者的概率,即 \(P_0dp_{i-1,j-1}\),否则每个人都向前挪了一位,原来第 \(j\) 个人变成了第 \(j-1\) 个人,即 \((1-P_0)dp_{i,j-1}\),故我们有 \(dp_{i,j}=P_0dp_{i-1,j-1}+(1-P_0)dp_{i,j-1}\),这样可以得到 \(i-1\) 个方程,可是要求出每个 \(dp_{i,j}\) 至少要 \(i\) 个方程啊……别急,显然最终幸存者一定存在于这 \(i\) 个人当中,因此所有 \(dp_{i,j}\) 的和为 \(1\),即 \(\sum\limits_{j=1}^idp_{i,j}=1\),这样就有 \(i\) 个方程了,可高斯消元了,复杂度 \(n·n^3=n^4\),一脸过不去的样子。

注意到这题中方程组的特殊性,如果我们先求出 \(dp_{1}\),在求出 \(dp_2,dp_3,\cdots\),那么在求 \(dp_{i,j}\) 时,\(P_0dp_{i-1,j-1}\) 必定是一个常数,也就是说前面 \(i-1\) 个方程都可以写成 \(dp_{i,j}=adp_{i,j-1}+b_j\) 的形式,因此我们考虑将所有 \(dp_{i,j}\) 都表示为 \(x_jdp_{i,1}+y_j\) 的形式,这显然可以在线性时间内求出,具体来说就 \(x_j=(1-P_0)x_{j-1},y_j=(1-P_0)y_{j-1}+P_0dp_{i-1,j-1}\),线性递推即可,这样最后 \(\sum\limits_{j=1}^idp_{i,j}=1\) 就可以化为 \((\sum\limits_{j=1}^ix_j)dp_{i,1}+(\sum\limits_{j=1}^iy_j)=1\),简单解个方程即可求出 \(dp_{i,1}\),然后再回代递推出其他 \(dp_{i,j}\) 即可,这样复杂度即可降到 \(n^2\)。

由于每次我们求 \(dp_i\) 只用到 \(dp_{i-1}\) 的值,因此需采用滚动数组优化空间,这样空间复杂度即可降到 \(\mathcal O(n)\)。

const int EPS=1e-8;
const int MAXN=1e4;
double p0;int n,k;
double pre[MAXN+5],cur[MAXN+5];
double calc(int n){
double sa=1,sb=0,cur=1,sum=0;
for(int i=2;i<=n;i++){
cur*=(1-p0);sum*=(1-p0);sa+=cur;
sum+=pre[i-1]*p0;sb+=sum;
} return (1-sb)/sa;
}
int main(){
scanf("%lf%d%d",&p0,&n,&k);
if(p0==0) return printf("%d\n",(n==1)?1:0),0;
pre[1]=1;
for(int i=2;i<=n;i++){
cur[1]=calc(i);
for(int j=2;j<=i;j++) cur[j]=cur[j-1]*(1-p0)+pre[j-1]*p0;
for(int j=1;j<=i;j++) pre[j]=cur[j];
} printf("%.10lf\n",pre[k]);
return 0;
}

洛谷 P5249 - [LnOI2019]加特林轮盘赌(期望 dp+高斯消元)的更多相关文章

  1. 洛谷 P5249 [LnOI2019]加特林轮盘赌 题解【概率期望】【DP】

    很有意思的题目. 题目背景 加特林轮盘赌是一个养生游戏. 题目描述 与俄罗斯轮盘赌等手枪的赌博不同的是,加特林轮盘赌的赌具是加特林. 加特林轮盘赌的规则很简单:在加特林的部分弹夹中填充子弹.游戏的参加 ...

  2. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  3. 洛谷P4035 [JSOI2008]球形空间产生器(高斯消元)

    洛谷题目传送门 球啊球 @xzz_233 qaq 高斯消元模板题,关键在于将已知条件转化为方程组. 可以发现题目要求的未知量有\(n\)个,题目却给了我们\(n+1\)个点的坐标,这其中必有玄机. 由 ...

  4. HDU 2262 Where is the canteen 期望dp+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...

  5. hdu4418 Time travel 【期望dp + 高斯消元】

    题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...

  6. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  7. LightOJ 1151 Snakes and Ladders 期望dp+高斯消元

    题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定   而且 ...

  8. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...

  9. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

随机推荐

  1. logging的基本使用

    logging模块打印log的时候主要有一下几个,级别顺序:CRITICAL>ERROR>WARNING>INFO>DEBUG: 1.日志输出到file: import log ...

  2. 二、Ansible基础之模块篇

    目录 1. Ansible Ad-Hoc 命令 1.1 命令格式 1.2 模块类型 1.3 联机帮助 1.3.1 常用帮助参数 1.4 常用模块 1.4.1 command & shell 模 ...

  3. C程序内存布局

    作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 . C程序的内存布局包含五个段,分别是STACK(栈段), ...

  4. 5个步骤,教你瞬间明白线程和线程安全.md

    记得刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他又接着问:那你再来说说什么是线程安全?--然后我就GG了 ...

  5. 单机CentOS 安装 TiDB

    目录 一.官网教程 二.安装步骤 1.下载并安装 TiUP: 2.声明一下环境变量,否则会找不到 tiup 命令 3.安装 TiUP 的 cluster 组件: 4.官方教程说,由于模拟多机部署,需要 ...

  6. 【UE4】GAMES101 图形学作业4:贝塞尔曲线

    总览 Bézier 曲线是一种用于计算机图形学的参数曲线. 在本次作业中,你需要实现de Casteljau 算法来绘制由4 个控制点表示的Bézier 曲线(当你正确实现该算法时,你可以支持绘制由更 ...

  7. 谜语人队 Scrum Meeting 博客汇总

    项目 内容 课程主页 2021春季软件工程(罗杰 任健) 作业要求地址 Alpha阶段:团队项目-每日例会报告Beta阶段:团队项目-每日例会报告 团队博客主页 谜语人队 一.Alpha阶段 第一次例 ...

  8. elasticsearch的dsl查询

    测试es的dsl查询,准备数据,在插入数据的时候,如果index.type.mapping都没有,es会自动创建 一.数据的准备 curl -XPOST "http://192.168.99 ...

  9. 小白学习C语言必背的18个经典程序

    1./*输出9*9口诀.共9行9列,i控制行,j控制列.*/ #include "stdio.h" main() {int i,j,result; for (i=1;i<10 ...

  10. 零基础入门必备的Linux命令和C语言基础

    文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...