HDU 4465 递推与double的精确性
题目大意不多说了
这里用dp[i][0] 代表取完第一个盒子后第二个盒子剩 i 个的概率,对应期望就是dp[i][0] *i
dp[i][1] 就代表取完第二个盒子后第一个盒子剩 i 个的概率
dp[i][0] = p^(n+1) * (1-p)^(n-i) * C(2*n-i , n-i) = p^(n+1) * (1-p)^(n-i) * (2*n-i)! / (n-i)! / n!
dp[i+1][0] = p^(n+1) * (1-p)^(n-i-1) * C(2*n-i-1 , n-i-1) = p^(n+1) * (1-p)^(n-i-1) * (2*n-i-1)! / (n-i-1)! / n!
dp[i][0] = dp[i+1][0] * (1-p) * (2*n-i) / (n-i)
dp[i][1]也是一样的道理
如果一开始给dp[n][0] 赋初值 pow(p,n+1) 那么如果n过大,那么因为精确度问题得到的是0
所以n+1个p在计算过程中在答案超过总数时一个一个往里乘
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = ;
double dp[N][]; int main()
{
// freopen("test.in","rb",stdin); int n,cas = ;
double p;
while(scanf("%d%lf",&n,&p)!=EOF){
double ans1 = ;
double ans2 = ;
int last[];
last[] = last[] = n+;
double q = -p;
dp[n][] = ;
dp[n][] = ;
ans1 += n;
ans2 += n;
for(int i=n-;i>=;i--){
double tmp1 = q * (*n-i) / (n-i);
double tmp2 = p * (*n-i) / (n-i); //递推过程,因为数目太多,p直接开方,数据大点的话就直接因精确度不够变为0
//所以每次在答案超过总数的情况下乘个p值
dp[i][] = tmp1 * dp[i+][];
dp[i][] = tmp2 * dp[i+][];
ans1 += (dp[i][] * i);
while(ans1>n){
dp[i][] *= p;
ans1 *= p;
last[]--;
}
ans2 += (dp[i][] * i);
while(ans2>n){
dp[i][]*=q;
ans2 *= q;
last[]--;
}
}
// cout<<" dp "<<dp[n]<<endl;
ans1 *= pow(p,last[]);
ans2 *= pow(q,last[]);
cas++; printf("Case %d: %.6f\n",cas,ans1+ans2);
}
return ;
}
HDU 4465 递推与double的精确性的更多相关文章
- HDOJ(HDU).2044-2049 递推专题
HDOJ(HDU).2044-2049 递推专题 点我挑战题目 HDU.2044 题意分析 先考虑递推关系:从1到第n个格子的时候由多少种走法? 如图,当n为下方格子的时候,由于只能向右走,所以有2中 ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- "红色病毒"问题 HDU 2065 递推+找循环节
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...
- Children’s Queue HDU 1297 递推+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1297 题目大意: 有n个同学, 站成一排, 要求 女生最少是两个站在一起, 问有多少种排列方式. 题 ...
- hdu 2044-2050 递推专题
总结一下做递推题的经验,一般都开成long long (别看项数少,随便就超了) 一般从第 i 项开始推其与前面项的关系(动态规划也是这样),而不是从第i 项推其与后面的项的关系. hdu2044:h ...
- ZOJ 3182 HDU 2842递推
ZOJ 3182 Nine Interlinks 题目大意:把一些带标号的环套到棍子上,标号为1的可以所以操作,标号i的根子在棍子上时,只有它标号比它小的换都不在棍子上,才能把标号为i+1的环,放在棍 ...
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- hdu 4055 递推
转自:http://blog.csdn.net/shiqi_614/article/details/7983298 题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果 ...
- HDU 3123-GCC(递推)
GCC Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...
随机推荐
- Join方法,yield方法,线程的优先级
- 线程池机制使nginx性能提高9倍
原文标题:Thread Pools in NGINX Boost Performance 9x! 原文官方地址:https://www.nginx.com/blog/thread-pools-boos ...
- thinkphp3.2.3连接sqlserver 2008 R2 数据库
环境: 操作系统——win7 64位旗舰版 PHP——thinkphp 3.23 数据库——Microsoft SQL Server 2008 R2 需要用到的软件: 步骤: 1.搜索SQLSRV30 ...
- Java语法基础-序列化
33. Java序列化中如果有些字段不想进行序列化,怎么办? 答:对于不想进行序列化的变量,使用transient关键字修饰. transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序 ...
- getDate() 各种时间格式
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE() ...
- 富文本KindEditor使用
1.官网down KindEditor,添加到自己的项目中:添加时可把不需要的文件夹干掉,asp/php等等.我的项目用的是纯html和js,直接调用后台api: 2.页面引入相关js.eclipse ...
- JAVA——不简单的fianl关键字
protected用来修饰 域,代表域的访问权限是:包权限 或者 不同包,但是是子类 : final 修饰常量只要是该常量代入的计算式,在编译时期,就会被执行计算,以减轻运行时的负担.(只对基本数据类 ...
- CREATE OPERATOR CLASS - 定义一个新的操作符类
SYNOPSIS CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR ...
- 使用VS Code调试Flutter(检查用户页面)
官方提供的是Flutter Widget Inspector,详见https://flutterchina.club/inspector/ 我用的是另外一种好用的调试工具 Dart DevTools ...
- C#面试问题及答案
1.遇到高并发的问题如何解决? 优化SQL语句 多线程 分布式服务器 集群 拆表2.Dictionary和ConurrentDictionary的区别? 后者是线程安全的 前者适用于单线程3.Dict ...