HDU.5985.Lucky Coins(概率DP)
\(Description\)
有n(n<=10)种硬币,已知每种硬币的数量和它抛一次正面朝上的概率pi。进行如下过程:每次抛一次所有硬币,将正面朝下的硬币去掉。重复该过程直到只剩一种硬币或是没有硬币。
如果结束时还剩下一种硬币,那称它是 \(LuckyCoin\)。求每种硬币成为 \(LuckyCoin\) 的概率。
\(Solution\)
我们只需要枚举在第j轮,硬币i死亡(这个词形象233),其它硬币在第j轮之前死亡的概率。
由给出的概率及六位小数可以看出,枚举到100轮就很够了。于是可以dp计算每种硬币在第j轮死亡的概率,然后前缀和一下,枚举轮数。(据说复杂度有点高?不太懂,不深究了...)
\(f[i][j]\) 表示在第j轮 硬币i死亡的概率,那么 \(f[i][j] = (1-p_i^j)^{num_i}\) (\(num_i\)枚硬币都挂掉才死亡;算存活概率的话好像因为有多个很不好算)
\(g[i][j]\) 表示在第j轮之后 硬币i仍存活的概率,那么 \(g[i][j] = 1 - f[i][j]\).
为了不重复统计(在第j+1轮i存活,但却计算在第j轮之前就死亡的所有硬币),对于每轮我们用i在j轮还存活,j+1轮i全部挂掉的概率,即 \(g[i][j]-g[i][j+1]\).
\]
我想问为什么存下 \(g[i][j]=1-f[i][j]\),计算用 \(g[][]\)就对,而不存直接用 \(1-f[][]\)这个式子答案怎么需要+1。。(精度?)
//0MS 1564K
#include <cstdio>
#include <cctype>
#define gc() getchar()
const int N=12;
int n,num[N];
double p[N],f[N][103],g[N][103];
inline double FP(double x,int k)//第一次写double快速幂。。
{
double t=1.0;
for(; k; k>>=1,x=x*x) if(k&1) t=t*x;
return t;
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1; i<=n; ++i) scanf("%d%lf",&num[i],&p[i]);
if(n==1) {puts("1.000000"); continue;}
for(int i=1; i<=n; ++i)
{
double pw=p[i];
for(int j=1; j<100; ++j,pw*=p[i]) f[i][j]=FP(1.0-pw,num[i]),g[i][j]=1-f[i][j];
}
for(int i=1; i<=n; ++i)
{
double res=0;
for(int j=1; j<100; ++j)
{
double pro=1.0;
for(int k=1; k<=n; ++k) if(k!=i) pro*=f[k][j];
res += (f[i][j+1]-f[i][j])*pro;
// res += (1-f[i][j]-1+f[i][j+1])*pro;
// res += (g[i][j]-g[i][j+1])*pro;
}
printf("%f%c",res+1,i==n?'\n':' ');
}
}
return 0;
}
HDU.5985.Lucky Coins(概率DP)的更多相关文章
- HDU 5985 Lucky Coins 数学
Lucky Coins 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5985 Description Bob has collected a lot ...
- HDU5985 Lucky Coins 概率dp
题意:给你N种硬币,每种硬币有Si个,有Pi 概率朝上,每次抛所有硬币抛起,所有反面的拿掉,问每种硬币成为最后的lucky硬币的概率. 题解:都知道是概率dp,但是模拟赛时思路非常模糊,很纠结,dp[ ...
- HDU 5985 Lucky Coins(概率)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5985 题意:有多种类型的硬币,每种类型的硬币都有一定的数量,现在每次抛硬币,除去朝下的硬币,知道最后 ...
- HDU 4089 Activation(概率DP)(转)
11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况. 像概率dp,公式推出来就很容易写 ...
- atcoderI - Coins ( 概率DP)
I - Coins Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement Let NN b ...
- 2017 ICPC乌鲁木齐 A Coins 概率dp
Coins 题意:一开始所有n个硬币都是反面朝上的,每次必须拿k个来抛,抛的人足够聪明,问m次之后向上的硬币的期望. 首先说了这个足够聪明的意思,就是只要向反面的有k个就不会sb地去拿向正面的来抛,想 ...
- 2017 ICPC Asia Urumqi A.coins (概率DP + 期望)
题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical c ...
- HDU 4405 Aeroplane chess (概率DP)
题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i 这个位置到达 n ...
- HDU - 5001 Walk(概率dp+记忆化搜索)
Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...
随机推荐
- Python远程连接模块-Telnet
Python远程连接模块-Telnet 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 虽然现在主流的python版本还是2.7,相信2020年python程序员都会偏向Python ...
- C语言扫盲篇
C语言扫盲篇 作者:尹正杰 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 一.什么是C语言 C 语言是一种通用的高级语言,最初是由 ...
- 写一个Windows服务
做了两个和Windows服务有关的项目了,最开始的时候没做过,不懂,现在明白了许多.需要注意的是,如果不想登录什么的,最后在添加安装程序的那里选择那个字长的右键属性,把启动方式改为local syst ...
- spring boot 分布式事务实现(XA方式)
关于spring boot 支持分布式事务,XA是常用的一种方式. 这里把相关的配置记下,方便以后使用. 首先配置两个不同的数据源 : 订单库.持仓库. /** * Created by zhangj ...
- transform 属性之 transform-origin与顺序问题
transform属性之 transform-origin 针对transform中的几种值的先后顺序 transform值的先后顺序: 注意: 当我们在旋转后再进行位移的时候,其实是按照旋转后的坐标 ...
- bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋
http://www.lydsy.com/JudgeOnline/problem.php?id=1800 圆上两条直径构成矩形的对角线 #include<cstdio> using nam ...
- 从零开始写一个武侠冒险游戏-0-开发框架Codea简介
从零开始写一个武侠冒险游戏-0-开发框架Codea简介 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.03 增加对 XCode 项目文件的说明. 概述 本游戏全 ...
- css 基础2
1.内部样式表: 2.行内样式表:在标签内写style,适合style 比较少的情况 3.外部样式表(外联式): 4.html标签可以分为:块级标签,h1~h6,div ,p,ul,ol,li,div ...
- jQuery1.11源码分析(3)-----Sizzle源码中的浏览器兼容性检测和处理[原创]
上一章讲了正则表达式,这一章继续我们的前菜,浏览器兼容性处理. 先介绍一个简单的沙盒测试函数. /** * Support testing using an element * @param {Fun ...
- 一个简单的二叉搜索树(C++实现)
参考:http://www.cnblogs.com/skywang12345/p/3576373.html 这里主要就是自己实现的代码,删除动作有点不一样: #ifndef __BSTREE_H__ ...