UVa 1639 (期望) Candy】的更多相关文章

题意: 两个盒子里各有n颗糖,每天有p的概率从第一个盒子里取一颗糖,1-p的概率从第二个盒子里去一颗糖.直到某一天打开某个盒子忽然发现没糖了,求另一个盒子里剩余糖果数的期望. 分析: 紫书上面已经分析的很清楚了,而且也给出了解决精度损失问题的方法,就是先取对数然后再乘幂. #include <cstdio> #include <cmath> + ; + ]; long double logC(int n, int m) { return logF[n] - logF[m] - lo…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4514 题意: 有两个盒子各有n(1≤n≤2e5)个糖,每天随机选一个(概率分别为p,1-p),然后吃一颗糖.直到有一天,打开盒子一看,没糖了!输入n,p,求此时另一个盒子里糖的个数的数学期望. 分析: 根据期望的定义,不妨设最后打开第1个盒子,此时第2个盒子有i颗,则这之前打开过n…
题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用long double来实现高精度,我先用的double一直WA,后来看了题解是用long double, 改了,可一直改不对,怎么输出结果都是-2.00000,搞了一晚上,真是无语,因为我输入输出数据类型是long double, 结果一直不对 ,可能是我的编译器是C89的吧,和C语言,输入输出格式不同…
题目链接:https://vjudge.net/problem/UVA-1639 题目大意: 有两个糖果盒,每个盒子里面有n个糖果,每天随机选一个(概率分别为p,1-p),然后吃一颗糖.直到有一天,打开盒子一看,没有糖了. 输入n,p;求此时另外一个盒子里面糖的个数的数学期望. 题目分析: 可以假设另外一个盒子里面还剩下i个,此时一共选了n+n-i次, 所以共有C(2n-i,n)种组合,期望为i*C(2n-i,n)*p^(n+1)*(1-p)^(n-i)+i*C(2n-i,n)*(1-p)^(n…
https://vjudge.net/problem/UVA-1639 有两个盒子各有n(n≤2*10 5 )个糖,每天随机选一个(概率分别为p,1-p),然后吃一颗糖. 直到有一天,打开盒子一看,没糖了! 输入n, p,求此时另一个盒子里糖的个数的数学期望. 若最后打开第1个盒子,此时第2个盒子有i颗,则这之前打开过n+(n-i)次盒子, 其中有n次取的是盒子1,其余n-i次取的盒子2, 概率为C(2n-i, n)*p^(n+1) *(1-p)^(n-i) 注意p的指数是n+1,因为除了前面打…
题意:两个箱子,每个箱子有n颗糖,每次有p的概率拿1号箱子的一颗糖出来(有1-p的概率拿2号箱子的一颗糖出来),问当打开某个箱子为空的时候,另一个箱子的期望糖的数量是多少 题解:枚举另一个箱子的糖的数量乘以可能性就是答案,一部分是:C(i,n+i) *p^(n+1) *(1-p)^i *(n-i)(剩下n-i颗糖) 注意可能是1号箱子糖拿完了,也可能是2号箱子糖拿完了,然后就是拿完了的那个箱子查看的次数不是n,而是n+1次:接着要注意精度,需要使用对数(e^In(x)=x)与long doubl…
X表示剩下的糖数量,如果最后打开的是p对应的盒子.划分:Xi表示剩下i个糖,最后一次选的概率为p, 前面的服从二项分布.根据全概率公式和期望的线性性,求和就好了. 精度处理要小心,n很大,组合数会很大,p的部分很小,要取对数,而且中间计算精度也要用long double才够. 组合数的对数预处理一下或者递推一下就好了. /********************************************************* * --------------Tyrannosaurus-…
设当前有k个,那么也就是说拿到其他图案的可能是(n-k)/n 那么要拿到一个就要拿n/(n-k)次 所以答案就是n(1/n + 1/(n-1) ......1/2 + 1 / 1) 看起来很简单,但是实现有很多细节 一开始我是写了一个分数加法的函数 然后发现中间过程会溢出 所以要做两个操作 (1)  分母为1和n不算,最后算整数部分再加上去 因为如果算的话就要乘进去,分母会溢出 (2)要直接算所有数的最小公倍数,然后分子一起加(看代码) 我一开始是单独一个个分数来加减,这样在算分子的时候中间结果…
设置最后打开的是盒子1, 另外一个盒子剩下i个 那么在这之前打开了n + n - i次盒子 那么这个时候的概率是C(2 * n - i, n) p ^ (n+1) (1-p)^ (n - i) 那么反过来最后打开的是盒子2, 那么概率是C(2 * n - i, n) p ^ (n-i) (1-p)^ (n +1) 那么当前的概率就是两个加起来,然后乘以权值,即i就可以了 所以枚举所有的i加起来就好了. 但这样会损失很多精度, 所以我们可以用对数 也就是说算的时候先取对数来算,后来再取回去 不要忘…
1639 - Candy Time limit: 3.000 seconds 1639 CandyLazyChild is a lazy child who likes candy very much. Despite being very young, he has two large candy boxes, each contains n candies initially. Everyday he chooses one box and open it. He chooses the fi…
设f(x)表示x转移到1需要的次数的期望,p(x)为不超过x的素数的个数,其中能整除x的有g(x)个 则有(1-g(x)/p(x))的概率下一步还是转移到x,剩下的情况各有1/p(x)的概率转移到x/y 根据全期望公式,f(x) = 1 + (1-g(x)/p(x)) * f(x) + sum{ 1/p(x) * f(x/y) | y是能整除x且不超过x的素数 } 代码是用记忆化搜索计算f的 #include <cstdio> #include <cstring> #include…
设d(i, j)表示前i局每局获胜的比例均不超过p,且前i局共获胜j局的概率. d(i, j) = d(i-1, j) * (1-p) + d(i-1, j-1) * p 则只玩一天就就不再玩的概率Q = sum{d(n, i) | 0 ≤ i ≤ p*n} 那么期望为 这是一个无穷级数,可以用高数的一些知识来解决. 另1-Q = t 将1-Q带入t,并将左边的Q乘过去得: 书上还介绍了一种更简单的方法,假设所求期望为e 第一天玩完就去睡觉,概率为Q,期望为1:第一天玩得高高兴兴,概率为1-Q,…
题意: 每张彩票上印有一张图案,要集齐n个不同的图案才能获奖.输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同). 分析: 假设现在已经有k种图案,令s = k/n,得到一个新图案需要t次的概率为:st-1(1-s): 因此,得到一个新图案的期望为(1-s)(1 + 2s + 3s2 + 4s3 +...) 下面求上式中的级数: 令 则 所以得到一个新图案的期望为: 总的期望为: 这道题的输出很新颖,如果是分数的话,就要以分数形式输出,具体细节详见代码. #include <ios…
题意: 从A到B两地相距D,之间有n段河,每段河有一条小船,船的位置以及方向随机分布,速度大小不变.每段河之间是陆地,而且在陆地上行走的速度为1.求从A到B的时间期望. 分析: 我们只要分析每段河的期望即可.设河的长度为L,船速为v.过河最短时间为刚好搭上从左向右开的小船L/v:最长时间为刚好没搭上从左向右开的小船,所以要等小船开到对岸再折返回来再到对岸,时间为3L/v,因为是均匀分布,所以期望为2L/v,最后再加上陆地上行走的时间就是答案. #include <cstdio> int mai…
根据组合数公式C(m,n),由于m可能达到20万,因此转换为ln,之后可以表达为ln(m!)-ln(n!)-ln((m-n)!); 求每一个c[n]时,也要根据杨辉三角求组合数进行转化. 注意long double输出一般要用cout, printf不好使. #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #define repu(i,a,b) for(int…
题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市之间,可以不经过妖怪而相互可达: (n<=30) 分析: 1.根据题意可知,我们要将每一个可以不经过妖怪的一个个连通分量找出来: 2.然后从一个连通分量走到另一个连通分量,这时肯定进过妖怪: 3.一个一个连通分量,完成了哪几个连通分量,需要保存,这时,就用集合的方式保存: 4.从一个连通分量,走到另…
选自: http://blog.csdn.net/myhelperisme/article/details/39724515 用dp(n)表示有n个位置时的期望值,那么,对于一个刚进来的人来说,他有 n 个选择,当他选择第 i 个位置时,此时的期望值是 [dp(i-k-1) + dp(n-i-k)  + 1] / n, 推导一下,就得 (2 * sum(n-k-1) ) / i + 1, (sum(i)是指 有1-n个位置时的dp总和. #include <iostream> #include…
题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C > B/D  <=> A * D > B * C #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostr…
起因:在2020年一场HDU多校赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有X,Y,Z块钱(1<=X,Y,Z<=1e6),钱数最多的(如果不止一个那么随机等概率的选一个)随机等可能的选另一个人送他一块钱.直到三个人钱数相同为止.输出送钱轮数的期望,如果根本停不下来(希望のはな繋いだ绊が~),输出-1. 做题过程:很显然我们可以得到一个DP想法dp[i][j]表示钱第二多的和第三…
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问题 |00|+|01|=|0| 注意序列是环形 // // main.cpp // poj3869 // // Created by Candy on 25/10/2016. // Copyright © 2016 Candy. All rights reserved. // #include <i…
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 题目大意:每晚打游戏.每晚中,赢一局概率p,最多玩n局,如果最后不能保证胜率大于p,则从此不玩.问打游戏的天数的期望. 解题思路: 首先分析每天晚上的. 设f[i][j]为前i天,已经赢j局的概率. 由全概率公式,那么当天晚上完蛋的概率q=f[n][0]+f[n][1]+.....f[n][终止条件]. 至于为什么从完蛋(输)的角度考虑,主要是由于n局的…
option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4136&mosmsg=Submission+received+with+ID+13952351" style="">题目连接:uva 1390 - Interconnect 题目大意:给出n表示有n个点,m表示有m条边,如今任选两点建立一条边.直到整个图联通,问说还需建立边数的期望,建过边…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1841 题意: 在一个电视娱乐节目中,你一开始有1元钱.主持人会问你n个问题,每次你听到问题后有两个选择:一是放弃回答该问题,退出游戏,拿走奖金:二是回答问题.如果回答正确,奖金加倍:如果回答错误,游戏结束,你一分钱也拿不到.如果正确地回答完所有n个问题,你将拿走所有的2^n元钱,成…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3382 题意: 你住在村庄A,每天需要过很多条河到另一个村庄B上班.B在A的右边,所有的河都在中间.幸运的是,每条河上都有匀速移动的自动船,因此每当到达一条河的左岸时,只需等船过来,载着你过河,然后在右岸下船.你很瘦,因此上船之后船速不变.日复一日,年复一年,你问自己:从A到B,平均…
题意:有n个地方,现在要站人进去,而每两个人之间至少要隔k个空地,问这n个地方能站的人数的期望是多少. 分析:考虑dp[i]表示 i 个地方能站的期望数,从左往右推, 如果i-k-1<1,那么最多只能站一个,dp[i] = 1, 如果 i-k-1>=1的话,如果第一个人站在第1个位置,那么右边会空出i-k-1个位置,如果站在2位置,那么右边会空出i-k-2个位置......且站在每个位置的概率为1/i,所以: dp[i]=1+(dp[1]+dp[2]+...+dp[i-k-1])/i,  又因…
题意不说了,概率和期望值要分开处理. 方法1:可以先算出到达每层的概率,然后再乘以每层的期望,每层的期望是固定的. 方法二:也可以从后往前直接推期望.为什么从后往前呢?因为第i层的时候,它可以跳到的层是不确定的,所以还不能知道那一层的期望,所以不能计算. 设dp[i]为从第i层跳到最底层能得到的值的期望,那么从后往前推就有dp[i] = dp[i+k]*p[k]; 此时dp[i+k]已知,最后dp[1]就是答案. 注意一点就是:顺着走是求的概率,而从后推到前才是期望. #include <ios…
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2422 题意:每天玩纸牌游戏,若胜的概率严格大于p时结束,第二天接着玩.每天最多玩n盘,n盘之后概率还是没有严格大于p,则结束而且以后再也不玩了.问玩多少天之后就不玩了. 思路: int a,b,n;double f[N][N]; int main()…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20869 [思路] DP+期望. 设f[x]表示从x转移到1的期望操作次数,则有: f[x]=1+f[x]*(1-g[x]/p[x])+sigma(f[x][y])/p[x] 进一步为: f[x]=(sigma(f[x/y])+p[x])/g[x] 其中p[x]表示1..x的素数个数,p[x]表示素数中可以整除x的个数. 保留vis可以节约时间. [代码] #inc…
Description You live in a village but work in another village. You decided to follow the straight path between your house (A) and the working place (B), but there are several rivers you need to cross. Assume B is to the right of A, and all the rivers…
题目链接 /* 到达一条河时,船在河中的位置是随机的,所以船到达岸边需要的时间在 0~2l/v 均匀分布,所以船到岸的期望为 (0+2l/v)/2 过河需要 l/v 的时间,所以过一条河总的期望为 (0+2l/v)/2 + l/v = 2l/v 陆地上的速度是确定的,可以直接先计算出来 期望是线性的,每条河期望相加即为过河的总期望 */ #include<cstdio> using namespace std; int main() { int n,d,p,l,v,cas=0; while(~…