[LnOI2019]加特林轮盘赌(DP,概率期望)

题目链接

题解:

首先特判掉\(p=0/1\)的情况...

先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度

设\(f[i]\)表示有\(i\)个人,\(k=1\)的时候幸存的概率

设\(g[i][j]\)表示\(i\)个人每个人挨一下恰好死\(j\)个人的概率

我们就可以列出转移方程:

\[f[i]=(1-p)\sum_{j=1}^{i-1}{f[j]*g[i-j]}+f[i]*g[i][0]
\]

  • 含义:枚举打了一圈后剩下多少人,乘\(1-p\)是因为要保证自己不死

把含有\(f[i]\)的项全部移到左边,化简得:

\[f[i]=\frac{(1-p)\sum_{j=1}^{i-1}{f[j]*g[i-1][i-j]}}{1-g[i][0]}
\]

于是我们就可以愉快地\(dp\)啦

数组\(g\)存不下来,\(dp\)的时候动态更新就好啦

如果\(k!=1\)怎么办呢?

我们可以把\(1\sim k-1\)的这些人先打一遍,对于每种剩下的人数分别计算答案,然后按照概率加起来就好了

\(double\)运算常数很大,比赛时一直\(TLE\)在\(65\)分,关于这个常数的问题有两种解决方法:

  • 可以把所有数全部乘上一个\(2e9\)转化为\(long long\)进行运算,算完在除回来,缺点是精度较低,容易写错
  • 直接把\(double\)换成\(longdouble\)就行了,不过稍微慢点

看了看排行榜,好像有\(O(n)\)的做法?

代码:

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<ctime>
  5. #include<queue>
  6. #include<stack>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<algorithm>
  10. #define qmax(x,y) (x=max(x,y))
  11. #define qmin(x,y) (x=min(x,y))
  12. #define mp(x,y) make_pair(x,y)
  13. using namespace std;
  14. typedef long long ll;
  15. typedef pair<int,int> pii;
  16. inline int read(){
  17. int ans=0,fh=1;
  18. char ch=getchar();
  19. while(ch<'0'||ch>'9'){
  20. if(ch=='-') fh=-1;
  21. ch=getchar();
  22. }
  23. while(ch>='0'&&ch<='9')
  24. ans=ans*10+ch-'0',ch=getchar();
  25. return ans*fh;
  26. }
  27. const ll maxn=1e4+100,w=2e9;
  28. int n,k;
  29. ll p,g[maxn],f[maxn],pp[maxn];
  30. double php;
  31. int main(){
  32. // freopen("nh.in","r",stdin);
  33. // freopen("zhy.out","w",stdout);
  34. scanf("%lf%d%d",&php,&n,&k);
  35. if(php==0){
  36. printf(n==1?"1\n":"0\n");
  37. return 0;
  38. }
  39. p=php*w;
  40. int x=k-1;
  41. f[1]=1*w,g[0]=w-p,g[1]=p;
  42. if(x==1)
  43. for(int j=0;j<=n;j++)
  44. pp[j]=g[j];
  45. for(int i=2;i<=n;i++){
  46. int j;
  47. for(j=1;j<i-3;j+=4){
  48. f[i]+=f[j]*g[i-j]/w;
  49. f[i]+=f[j+1]*g[i-j-1]/w;
  50. f[i]+=f[j+2]*g[i-j-2]/w;
  51. f[i]+=f[j+3]*g[i-j-3]/w;
  52. }
  53. for(;j<i;j++) f[i]+=f[j]*g[i-j]/w;
  54. (f[i]*=w-p)/=w;
  55. for(j=i;j>=4;j-=4){
  56. g[j]=(g[j-1]*p+g[j]*(w-p))/w;
  57. g[j-1]=(g[j-2]*p+g[j-1]*(w-p))/w;
  58. g[j-2]=(g[j-3]*p+g[j-2]*(w-p))/w;
  59. g[j-3]=(g[j-4]*p+g[j-3]*(w-p))/w;
  60. }
  61. for(;j;j--) g[j]=(g[j-1]*p+g[j]*(w-p))/w;
  62. (g[0]*=w-p)/=w;
  63. if(i==x)
  64. for(int j=0;j<=n;j++)
  65. pp[j]=g[j];
  66. (f[i]*=w)/=w-g[0];
  67. }
  68. if(x==0){
  69. printf("%.12lf\n",f[n]*1.0/w);
  70. return 0;
  71. }
  72. double ans=0;
  73. for(int i=0;i<=x;i++){
  74. ans+=pp[i]*f[n-i]/w;
  75. }
  76. printf("%.12lf\n",ans*1.0/w);
  77. return 0;
  78. }

[LnOI2019]加特林轮盘赌(DP,概率期望)的更多相关文章

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

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

  2. 洛谷 P5249 - [LnOI2019]加特林轮盘赌(期望 dp+高斯消元)

    题面传送门 期望真 nm 有意思,所以蒟蒻又来颓期望辣 先特判掉 \(P_0=0\) 的情况,下面假设 \(P_0\ne 0\). 首先注意到我们每次将加特林对准一个人,如果这个人被毙掉了,那么相当于 ...

  3. Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)

    题目链接:传送门 题目大意: 给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子. 问k次操作之后,留在黑板上的数的期望. 要求结果对109+7取模,若结果不是整数 ...

  4. hdu-5781 ATM Mechine(dp+概率期望)

    题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  5. BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...

  6. hdu-5816 Hearthstone(状压dp+概率期望)

    题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  7. BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...

  8. [LnOI2019]加特林轮盘赌

    Luogu5249 轮流开枪打一个环上的人 , 每次\(p\)的概率打死 , \(p\)始终相同 , 从第\(1\)个人开始 , 求第\(k\)个人成为唯一幸存者的概率 \(19.3.30\) 官方题 ...

  9. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

随机推荐

  1. CGContextRef用法

    本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...

  2. sql优化(1)

    转自:https://blog.csdn.net/jie_liang/article/details/77340905 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化, ...

  3. input 和 button 的 border-box 模型和 IE8 错位

    用 input 和 button 时出现了几个奇怪的现象,先放几个 input 和 button CSS: * { margin:; padding:; } input,button { width: ...

  4. pip install selenium==版本号 报错

    安装selenium是注意不要带版本号直接用如下命令: pip install selenium

  5. sql---如何把sql查询出来的结果当做另一个sql的条件查询,1、语句2、with as

    '; -- table2 的 name 作为 table1的条件 select * from table1 where name in (select name from table2) --如果有多 ...

  6. InnoDB缓存读命中率、使用率、脏块率(%) 缓冲池的读命中率(%) 缓冲池的利用率(%) 缓冲池脏块的百分率(%)

    InnoDB缓存读命中率.使用率.脏块率(%) 缓冲池的读命中率(%) 缓冲池的利用率(%) 缓冲池脏块的百分率(%)

  7. 短URL DH 密钥交换算法

    w  追问:0-短URL 的时效性,(比如微信个人账户的永久二维码和群的约7天时效二维码):1-0中的时效性对于算法选择的影响,比如简单的HAS映射.sha1.md5......   https:// ...

  8. Design Pattern - 命令模式

    一般执行一个操作的过程, 创建对象, 并调用对象的函数, 函数执行, 返回 比如下面的类图, client直接调用Receiver.action 而命令模式, 抽象出command对象, 并在comm ...

  9. Python菜鸟之路:Django 文件上传的几种方式

    方式一:通过form表单中,html input 标签的“file”完成 # 前端代码uoload.html <form method="post" action=" ...

  10. 0502-Hystrix保护应用-简介,使用,健康指标等

    一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_circuit_ ...