[关闭]
@xiaoziyao 2020-06-16T12:46:14.000000Z 字数 967 阅读 965

CF235B Let's Play Osu!解题报告

解题报告


CF235B Let's Play Osu!解题报告:

更好的阅读体验

题意

题意:给定一个序列,每一个位置的几率为,长度为的极长序列的贡献为,求期望贡献。
数据范围:

分析

很容易发现这是一道概率dp。

我们考虑以为结尾的极长序列长度为,则可以分两种情况讨论的转移:

  1. 位置为,几率为,期望长度为
  2. 位置为,几率为,期望长度为

我们求得了位置的期望长度为后,可以考虑转移答案

首先,在这个极长序列之前的期望贡献显然不需要考虑,我们只需要考虑以结尾的极长序列:
1. 若当前位置为,概率为,则在位置时,期望长度为,则期望贡献为;在位置时,期望长度为,则期望贡献为。这两个式子相减则为答案:
2. 若当前位置为,概率为,则无以结尾的极长序列,无贡献。

代码

记得保留位小数。

  1. #include<stdio.h>
  2. const int maxn=100005;
  3. int i,j,k,m,n;
  4. double len[maxn],ans[maxn];
  5. int main(){
  6. scanf("%d",&n);
  7. for(i=1;i<=n;i++){
  8. double p;
  9. scanf("%lf",&p);
  10. len[i]=(len[i-1]+1.0)*p+0.0*(1-p);
  11. ans[i]=ans[i-1]+(2.0*len[i-1]+1.0)*p+0.0*(1-p);
  12. }
  13. printf("%.15lf",ans[n]);
  14. return 0;
  15. }

后话

本题弱化版:P1365 WJMZBMR打osu! / Easy
本题扩展版:P1654 OSU!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注