[Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

题面

一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每通过一关后可以选择继续下一关或者时间清0并从第一关开始,先要求通过所有关卡的时间和不能超过R才算彻底通关,问直到彻底通关位置的游戏时间的期望值为多少

分析

二分从头开始通关的用时期望mid

设\(dp[i][j]\)表示通前i关,当前时间为j的期望,倒推期望.

若超时重新开始,则\(dp[i][j]=mid\)

若用方法a通过这一关,则更新j,\((dp[i+1][j+a[i]]+a[i])*p[i]\)

用方法b同理

总而言之,有$$dp[i][j]=min(mid,(dp[i+1][j+a[i]]+a[i])p[i],(dp[i+1][j+b[i]]+b[i])(1-p[i]))$$

如果最终答案\(dp[1][0]<mid\),就缩小二分范围,否则增大二分范围

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 50
  6. #define maxv 5000
  7. #define maxrb 1e10
  8. #define maxt 150 //二分答案迭代次数,处理精度
  9. using namespace std;
  10. int n,r;
  11. int a[maxn+5],b[maxn+5];
  12. double p[maxn+5];
  13. double dp[maxn+5][maxv+5];
  14. //dp[i][j]第i关,用时j通关的期望
  15. //二分从1关开始通完的期望mid
  16. bool check(double mid){
  17. for(int i=n;i>=1;i--){
  18. for(int j=r+1;j<=maxv;j++){
  19. dp[i+1][j]=mid;
  20. //通关超过时间限制,回到起点重新开始
  21. }
  22. for(int j=0;j<=r;j++){
  23. double t1=(dp[i+1][j+a[i]]+a[i])*p[i];
  24. double t2=(dp[i+1][j+b[i]]+b[i])*(1-p[i]);
  25. dp[i][j]=min(mid,t1+t2);
  26. }
  27. }
  28. if(dp[1][0]<mid) return 1;//如果实际dp值比二分值更小,可以继续缩小二分范围
  29. else return 0;
  30. }
  31. int main(){
  32. scanf("%d %d",&n,&r);
  33. for(int i=1;i<=n;i++){
  34. scanf("%d %d",&a[i],&b[i]);
  35. scanf("%lf",&p[i]);
  36. p[i]/=100;
  37. }
  38. double lb=0,rb=1e10,mid,ans=0;
  39. for(int i=1;i<=maxt;i++){
  40. mid=(lb+rb)/2;
  41. if(check(mid)){
  42. ans=mid;
  43. rb=mid;
  44. }else lb=mid;
  45. }
  46. printf("%.9lf",ans);
  47. }

[Codeforces 865C]Gotta Go Fast(期望dp+二分答案)的更多相关文章

  1. Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)

    第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...

  2. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  3. codeforces gym 100947 J. Killing everything dp+二分

    J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...

  4. BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案

    题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...

  5. CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)

    All submissions for this problem are available. Chef likes numbers and number theory, we all know th ...

  6. [luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]

    [luogu]P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块, ...

  7. HAOI2008 木棍分割 数据结构优化dp+二分答案

    很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB   2019-05-07 17:01:23 Short 不打滚动数组 #419. ...

  8. Codeforces Round #377 (Div. 2) D. Exams(二分答案)

    D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...

  9. CodeForces 371C Hamburgers(经典)【二分答案】

    <题目链接> 题目大意: 给以一段字符串,其中只包含"BSC"这三个字符,现在有一定量免费的'B','S','C‘,然后如果想再买这三个字符,就要付出相应的价格.现在总 ...

随机推荐

  1. mysql导出函数或者存储过程 设置显示方式

    mysql导出函数或者存储过程 mysqldump -hhostname -uusername -ppassword -ntd -R databasename > /app/backupflie ...

  2. OpenVINO 安装及使用

    安装 https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html 使用 文档 ...

  3. 树——sum-root-to-leaf-numbers(根到叶节点数字之和)

    问题: Given a binary tree containing digits from0-9only, each root-to-leaf path could represent a numb ...

  4. 【串线篇】spring boot配置嵌入式servlet容器

    SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 问题? 一.如何定制和修改Servlet容器的相关配置 1.方法1修改和server有关的配置(ServerProperties ...

  5. CSS多列布局(栅格布局)

    一.多列布局 CSS3 可以将文本内容设计成像报纸一样的多列布局,如下实例: 代码如下(具体的解释也在代码中)浏览器支持表格中的数字表示支持该方法的第一个浏览器的版本号. 紧跟在数字后面的 -webk ...

  6. layer-框架使用修改部分

    关于框架中js调子方法出错的处理 top.layer.open({ id: options.id, type: 2, shade: options.shade, title: options.titl ...

  7. python学习笔记(六)函数

    1.函数是什么? 定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,只需调用函数名即可. 2.函数的好处: 简化代码 提高代码的复用性 代码可扩展 3.python中函数的定义: 定义函数使 ...

  8. shell学习记录----初识sed和gawk

    Linux命令行与shell脚本编程大全中关于sed和gawk的介绍合在一起,而且结构有点乱. 不像之前的命令写的很清楚.所以这次我需要写下来整理一下. 一.sed部分 1.1 sed命令格式如下: ...

  9. 27 August

    高精度 struct bigint{ int a[1000],an; bigint operator = (int b){ an=0; while (b){a[an++]=b%10;b/=10;} r ...

  10. vue中操作Dom节点的方法

    1.vue中ref操作dom节点 <template> <div id="app"> <div </div> <button @cl ...