UVa 11021 (概率 递推) Tribles

Tribble是麻球?

因为事件都是互相独立的,所以只考虑一只麻球。

设f(i)表示一只麻球i天后它以及后代全部死亡的概率,根据全概率公式:

f(i) = P0 + P1 * f(i-1) + P2 * f(i-1)2 + ... + Pn * f(n)n

每个麻球死亡是独立的,所以Pj * f(i-1)j 表示生了j个麻球,这j个麻球要在i-1天内全部死亡。

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4
 5 const int maxn = 1000 + 10;
 6 double f[maxn], p[maxn];
 7
 8 int main()
 9 {
10     //freopen("in.txt", "r", stdin);
11
12     int T;
13     scanf("%d", &T);
14     for(int kase = 1; kase <= T; kase++)
15     {
16         int n, k, m;
17         scanf("%d%d%d", &n, &k, &m);
18         for(int i = 0; i < n; i++) scanf("%lf", &p[i]);
19         f[0] = 0;
20         f[1] = p[0];
21         for(int i = 1; i <= m; i++)
22         {
23             f[i] = 0;
24             for(int j = 0; j < n; j++) f[i] += p[j] * pow(f[i-1], j);
25         }
26         printf("Case #%d: %.7f\n", kase, pow(f[m], k));
27     }
28
29     return 0;
30 }

代码君

时间: 2024-10-10 06:49:14

UVa 11021 (概率 递推) Tribles的相关文章

UVa 557 (概率 递推) Burger

题意: 有两种汉堡给2n个孩子吃,每个孩子在吃之前要抛硬币决定吃哪一种汉堡.如果只剩一种汉堡,就不用抛硬币了. 求最后两个孩子吃到同一种汉堡的概率. 分析: 可以从反面思考,求最后两个孩子吃到不同汉堡的概率. 因为最后两个汉堡是不同的,所以前面的2n-2个孩子吃汉堡之前一定都是要抛硬币的. 所以,吃两种汉堡的孩子人数相等,都是n-1个. 令,对于2n个孩子吃汉堡,所求概率为1 - f(n-1) 我们还可以递推f, 1 #include <iostream> 2 #include <cst

UVA 11021 - Tribles(概率递推)

UVA 11021 - Tribles 题目链接 题意:k个毛球,每个毛球死后会产生i个毛球的概率为pi,问m天后,所有毛球都死亡的概率 思路:f[i]为一个毛球第i天死亡的概率,那么 f(i)=p0+p1f(i?1)+p2f(i?1)2+...+pnf(i?1)n 然后k个毛球利用乘法定理,答案为f(m)k 代码: #include <stdio.h> #include <string.h> #include <math.h> const int N = 1005;

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

UVA 1541 - To Bet or Not To Bet(概率递推)

UVA 1541 - To Bet or Not To Bet 题目链接 题意:这题题意真是神了- -,看半天,大概是玩一个游戏,开始在位置0,终点在位置m + 1,每次扔一个硬币,正面走一步,反面走两步,走到的步上有4种情况: 1.向前走n步 2.向后走n步 3.停止一回合 4.无影响 问能在t次机会内,走到终点m + 1(如果跃过也算走到了)的概率,大于0.5,等于0.5,小于0.5对应不同输出 思路:题意懂了就好办了,其实就是递推就可以了dp[i][j]表示第i次机会,落在j步的概率,然后

UVA 11427 - Expect the Expected(概率递推期望)

UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏,赢的概率p,一个晚上能玩n盘,如果n盘都没赢到总赢的盘数比例大于等于p,以后都不再玩了,如果有到p就结束 思路:递推,dp[i][j]表示玩i盘,赢j盘的概率,那么一个晚上玩了n盘小于p的概率递推式为: dp(i,j)=dp(i?1,j)?(1?p)+dp(i?1,j?1)?p 总和为Q=dp(n,0)+dp(n,1)+...+dp(n,x)(x/n<p) 那么每个晚上失败的概率Q就求出来了,那么平均玩的

UVA 10237 - Bishops(递推)

UVA 10237 - Bishops 题目链接 题意:问一个n * n棋盘能放k个主教(攻击斜线)的方案数. 思路:递推,首先考虑一个问题,在一个n?n棋盘上,放k个车的方案数. 那么设dp[i][j]为i行用了j个车的方案数,由于每行只能放一个车,那么考虑i行放不放车,如果放车,那么能放的位置有n?(j?1)个位置,为dp[i?1][j?1]?(n?(j?1)). 如果不放那么情况为dp[i?1][j]. 所以递推式为dp[i][j]=dp[i][j?1]+dp[i?1][j?1]?(n?(

UVA 1425 - Metal(递推)

UVA 1425 - Metal 题目链接 题意:给定一个金属板,上面有一些点,现在有一台切割机,要切割出单调四边形,由所有点组成,问有多少种情况. 思路:递推,设dp[i][j],i为上面点,j为下面点,现在多添加一个点k进来,那么原来的dp[i][j]必然要有一维为k - 1,枚举另外一维就是所有情况.然后再添加点进来的过程中还要考虑能不能加进来,写一个判断函数,把连接线之间所有点枚举一边利用向量叉积去判断即可,如果是上面的线,就不能有点在上面,如果是下面的线,就不能有点再下面. 代码: #

uva 11375 - Matches(递推)

题目链接:11375 - Matches 题目大意:给出n根火柴,问说能组成多少种数字,要求说0不能打头. 解题思路:d[i]表示i根火柴能够组成的数量,d[i+c[j]] = d[i+c[j]] + d[i]; 最后dp[i]表示小于等于i根火柴能组成的数量,dp[i]=∑jidp[j]. 高精度. #include <cstdio> #include <cstring> #include <iostream> using namespace std; const i

uva 279 - Spin(递推)

题目链接:uva 279 - Spin 题目大意:进行一个游戏,给出初始状态,要求问说最少多少步可以让所有的环移动出来.移动规则如图所示. 解题思路:一开始以为是隐式图搜索,写完TLE了.后来发现这道题和汉诺塔是一个思路,都是采取最优策略,并且说左边环的状态不会影响右边环.所以dp[i]表示从右边数,第i个为v,其他均为h的步数(由全h变换至). 模拟最优过程有dp[i]=dp[i?1]?2+i?2?1 对已给定状态,可看做由全h变换到该状态的步数.根据容斥原理,第奇数个v为加,偶数个v为减.最