[水题日常]UVA1639 糖果(Candy,ACM/ICPC Chengdu 2012)
- 今天来尝试了几道数学期望相关的题,这是我认为比较有趣的一道题
- 这次不废话啦直接开始~
- 一句话题意:两个分别装有n个糖果的盒子,每次随机选一个盒子然后拿走一颗糖(选的概率分别是\(p\)和\((1-p)\)),直到有一次选了一个盒子打开之后发现没有糖果了,求另一个盒子糖果个数的期望值
- \(n<=2*10^5\)
嗯首先我们得知道期望的线性性质:\(E(X+Y)=E(X)+E(Y)\)
如果我们假设最后打开的是第一个盒子,那么第二个盒子的糖果个数其实可能有\(0~n\)个,如果已经知道了有\(i\)个的概率就好了,这样根据期望的线性性质答案就是把所有的\(i*P(i)\)加起来(当然还要考虑最后打开第二个盒子)
好的我们现在来具体考虑第二个盒子有\(i\)个糖果的情况,第二个盒子还有\(i\)个的话那么在这之前盒子一定被打开过了\(n+n-i=2n-i\)次(\(n\)次取第一个盒子,\(n-i\)次取第二个),这样一来概率就是\(C(2n-i,n)p^{n+1}(1-p)^{n-i}\)(因为在这之前取了\(n\)次第一个盒子,这次又取了一次)
然后每次枚举一下\(i\)对两种情况(最后打开第一个或第二个盒子)求个和是不是就可以了?
蓝鹅这样子在理论上是正确的,但是实际求的时候\(C(2n-i,n)\)可以挺大的,而\(p^{n+1}\)和\((1-p)^{n-i}\)会很小,直接算的话会有精度误差(当然如果你要写高精度我也不拦你~),而且这个误差应该会比较大,大概超出了题目的要求(我之前改进后过程用double好像都wa掉了…),那么怎么办呢?
紫书上关于这题介绍了一种取对数的处理方法,具体来说就是在算的过程中全部取对数(我这里是\(e\)为底啦…不过好像一般也都是这样),比如最后打开第一个盒子时第二个盒子有\(i\)个糖果的概率取\(e\)的对数就是\(v1(i)=ln(C(2n-i,n))+(n+1)ln(p)+(n-i)ln(1-p)\)啦(第二个盒子的情况同理),最后把答案加上\(i(e^{v1(i)}+e^{v2(i)})\)就好啦~
预处理阶乘的对数的时候注意可能会用到\(n\)的两倍
再具体的话就没什么好说的啦
还是存一下代码吧~
#include<cstdio>
#include<cmath>
typedef long double ldouble;
const int N=200005;
ldouble p,LogF[N<<1];
inline double getC(int n,int k)
{
return LogF[n]-LogF[k]-LogF[n-k];
}
inline double solve(int n)
{
double ans=0.0;
for(int i=0;i<=n;i++)
{
ldouble c=getC(2*n-i,n);
ldouble v1=c+log(p)*(n+1)+log(1-p)*(n-i);
ldouble v2=c+log(p)*(n-i)+log(1-p)*(n+1);
ans+=i*(exp(v1)+exp(v2));
}return ans;
}
int main()
{
int n,kase=0;LogF[0]=0;
for(int i=1;i<(N<<1);i++)LogF[i]=LogF[i-1]+log(i);
while(scanf("%d%Lf",&n,&p)==2)
printf("Case %d: %.6lf\n",++kase,solve(n));
return 0;
}
如果有错欢迎指出~
撒椛~(雾)
[水题日常]UVA1639 糖果(Candy,ACM/ICPC Chengdu 2012)的更多相关文章
- codevs 3070 寻找somebody4(水题日常)
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一天.....sb不见了,有个人要去找他..他发现sb在一个杨辉三角里.. ...
- 每天一套题打卡|河南省第八届ACM/ICPC
A 挑战密室 化学方程式求分子量 这题我懒得写了 可以用map<string,int>哈希表,表示每种分子的相对分子质量 之后,从头遍历到尾. 1.数字:连读直到不是数字 2.字母:连读直 ...
- [水题日常]Luogu1113 杂务
这几天又在颓. 我的blog难度目前还比较低,主要面向像我这样子的新手(当然内容也会尽量讲得具体清楚一些)x 如果有错误还请指出~ 写完随笔之后才去翻了一下这题题解之后才注意到这题是有序的 QAQ完全 ...
- codevs 1487 大批整数排序(水题日常)
时间限制: 3 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description !!!CodeVS开发者有话说: codevs自从换了评测机,新评测机的内存计算 ...
- 51nod 1096 距离之和最小(水题日常)
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离之和. Input 第1行:点的数量 ...
- [水题日常]UVA11181 条件概率(Probability|Given)
话说好久没写blog了 好好学概率论的第一天,这题一开始完全不会写,列出个条件概率的公式就傻了,后来看着lrj老师的书附带的代码学着写的- 因为我比较弱智 一些比较简单的东西也顺便写具体点或者是按照书 ...
- vijos 1034 家族(水题日常)
描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚 ...
- 洛谷 P1181 数列分段Section I(水题日常)
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...
- codevs 2728 整数帝国问题(水题日常)
时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题目描述 Description 在很久以前,在遥远的东方,有一个整数帝国,它里面里居住着大量的正整数,了缓解都 ...
随机推荐
- FL Studio杂项设置页讲解(上)
今天我们来看一下FL Studio通道设置窗口中的杂项设置页面.该页面存在于FL Studio绝大多数的通道中,我们可以通过它来设置一些发生器或者第三方插件的参数,接下来就让我们一起来学习下这些参数的 ...
- 手把手为大家演示fat32转ntfs操作过程,一看就会
fat32和ntfs是两种我们较为常见的u盘或者硬盘格式.它们都有着各自的特点,但是相比之下,使用ntfs文件格式我们可以做出很多fat32不能实现的功能.在日常生活中,我们会面临到需要把fat32转 ...
- Contest 991
A 先判合法然后容斥. 时间复杂度 \(O\left(1\right)\). B 贪心选最小的实验做成 \(5\) 分. 时间复杂度 \(O\left(n\right)\). 剩下的鸽了.
- NOIP2012 解题报告
TG Day1 T3 开车旅行 1. 预处理出从每座城市两人分别会到达的两座城市. 用 set 可以轻松实现. 2. 用倍增优化 DP 令 \(f_{i,j,k}\) 表示从城市 \(j\) 出发,行 ...
- 完全图的最短Hamilton路径——状压dp
题意:给出一张含有n(n<20)个点的完全图,求从0号节点到第n-1号节点的最短Hamilton路径.Hamilton路径是指不重不漏地经过每一个点的路径. 算法进阶上的一道状压例题,复杂度为O ...
- Eclipse中自动生成局部变量
方法调用后,返回值自动赋值到一个新的局部变量中: (1)鼠标放到方法上,点击Ctrl+1 (2)选择 :Assign statement to new local variable(将语句赋给新的局部 ...
- SQL注入步骤
1.判断是否存在注入,注入是字符型还是数字型2.猜解SQL查询语句中的字段数3.确定回显的字段数4.获取当前数据库5.获取表中字段名6.下载数据
- 删除list列表中的某一个元素的多种方法
当我们在处理业务的时候,很多情况下数据都要进行一层层的过滤,最近需要给一个列表中去除不符合条件的元素, 本来觉着挺简单的,Google了下发现很多方法都是旧方法,根本不符合我的需求. 于是参考着网上的 ...
- 基于CefSharp开发(五)浏览器菜单样式
一.菜单分析 上图为Edge浏览器现有的菜单内容,菜单中即有子菜单也有组合菜单. 本章节将开发浏览器菜单样式,菜单部分功能将后期进行处理. 二.创建菜单用户控件 新建用户控件命名为WebMenuUc, ...
- Python【集合】、【函数】、【三目运算】、【lambda】、【文件操作】
set集合: •集合的创建; set_1 = set() #方法一 set_1 = {''} #方法二 •set是无序,不重复的集合; set_1 = {'k1','k2','k3'} set_1.a ...