坑,一开始以为,分成两半的时候去最大那个就行了,

实际上这样是不对的,因为有可能出现小的一半的时间比大的要长,

因为还和等待次数有关,且转移的时候需要用到次数更小的状态,

所以状态定义为二维,dp[i][j]表示长度为i的区间,放小于等于j次的概率。

要求确切的某次的概率,比如k,就只要用dp[i][k]-dp[i][k-1]就行了。

如何转移?从小到大枚举i,从小到大枚举j,初始化dp[i][j] = dp[i][j-1],

然后求出确切等待j次的概率,以k为界限划分区间,分成l,r两段,加上l区间等待j-1次且r区间等待小于等于j-1次的概率,

类似得加上r区间等待j-1次且l区间等带小于等于j-1次的概率,然后减掉重复计算的状态。

因为只要求中间等待的次数,且一开始要放两个鞭炮,所以可以等效为一开始不计等待,之后每次都计算等待时间。

还有一个细节是每次j从2开始枚举,放一次的只可能是长度为1的情况。

g++使用%lf正常,但在有些oj却会出问题

#include<bits/stdc++.h>
using namespace std; const int maxn = ; double dp[maxn][maxn]; int main()
{
//freopen("in.txt","r",stdin);
int n; scanf("%d",&n);
n -= ; for(int i = ; i <= n; i++){
for(int j = i; j <=n; j++)
dp[i][j] = ;
} for(int i = ; i <= n; i++){
double e = ./i;
for(int j = ; j < i; j++){
dp[i][j] = dp[i][j-];
for(int k = ; k <= i; k++){
int l = k-,r = i-k;
double p1 = dp[l][j-] - dp[l][j-], p2 = dp[r][j-] - dp[r][j-];
double p3 = dp[l][j-];
double p4 = dp[r][j-];
dp[i][j] += e*(p1*p4 + p2*p3 - p2*p1);
}
}
}
double ans = ;
for(int i = ; i <= n; i++){
ans += (dp[n][i]-dp[n][i-])*i*;
}
printf("%.11lf\n",ans);
return ;
}

最新文章

  1. 作业二:Github注册账户过程
  2. vector 之删除元素
  3. asp.net mvc处理css和js版本问题
  4. opencv的初体验
  5. Eclipse去除jquery引入错误
  6. Qt5+VS2013兼容XP方法
  7. Hadoop-1.1.2、HBase-0.94.7完全分布式集群结构
  8. webpack入门之打包html,css,js,img(一)
  9. Android 源码中的设计模式
  10. Maven常用命令:
  11. mac与windows共享键盘鼠标(synergy)
  12. hibernate 一对多关系中的孤儿属性
  13. Jenkins系统监测
  14. Linux 的系统目录介绍
  15. Java 多态的实现机制
  16. 【转载】To the Virgins, to Make Much of Time
  17. 揭开Docker的神秘面纱
  18. WebApp分析建模的工具
  19. python实现itemCF and userCF
  20. Zookeeper一致性协议原理Zab

热门文章

  1. Flutter实战视频-移动电商-13.首页_广告Banner组件制作
  2. Flutter实战视频-移动电商-37.路由_Fluro引入和商品详细页建立
  3. UVa 10214 Trees in a Wood. (数论-欧拉函数)
  4. OpenCV入门指南
  5. 小程序隐藏或自定义 scroll-view滚动条
  6. AndroidStudio给Unity打jar包
  7. Elasticsearch学习记录(分布式的特性)
  8. nginx+vue实现项目动静分离
  9. [软件工程基础]PhyLab 需求与功能分析改进文档
  10. ZJOI2017 day2 T2 线段树 想法题