链接https://ac.nowcoder.com/acm/problem/14962 来源:牛客网 Alice和Bob赌糖果。规则是这样的:Alice从[ l, r]中随机抽一个数,Bob从[ L, R]中随机抽一个数,谁抽的数大谁就赢,输的一方给另一方1颗糖(平局不用给糖),他们会一直赌下去直到有一方没有糖果为止。Alice有n颗糖果,Bob有m颗糖果,求Alice将Bob的糖果赢完的概率。 第一行3个整数n, l, r。 Alice将Bob糖果赢完的概率,结果保留5位小数。 输入 输入 0 <= n,m <=1e5,n+m > 0 首先我们大致理解下题意:Alice起始位置在坐标轴的n点,他往右走一格的概率是题目描述
输入描述
第二行3个整数m, L, R。输出描述
示例1
1 1 3
1 1 2
输出
0.75000示例2
0 1 100
1 1 100
输出
0.00000备注
1 <= l <= r <= 100,1 <= L <= R <= 100思路
p,往左走一格的概率是
1−p,题目要求的则是Alice走到
n+m处的概率。
思路:假设Alice赢的概率为
p,输的概率则为
1−p,当Alice有
i颗糖果时,其将Bob的糖果赢完的概率设为
fi,可列出以下方程:
f0=0, fn+m=1
fi=(1−p)fi−1+pfi+1 (1)
根据题目
fn+m=1 我们采用倒推,假设
fi=kifi+1带入(1)式中得到
ki的递推关系式:
ki=1−(1−p)ki−1p(2)
∵
f0=0f1
∴
k0=0
综上述可知答案为
fn=∏i=nn+m−1ki代码示例
#include <iostream> using namespace std; double calc(int a, int b, double p){ double ans = 1.0, k = 0.0; for(int i = 1; i < b; i++){ k = p / (1 - (1 - p) * k) ;//思路中的公式2 if(i >= a) ans *= k; } return ans; } int main(){ int n, l, r, m, L, R; scanf("%d%d%d%d%d%d", &n, &l, &r, &m, &L, &R); if(!n) printf("0.00000");//特判Alice开始没有糖果的时候,赢的概率为0 else{ int t1 = 0, t2 = 0; for(int i = l; i <= r; i++) for(int j = L; j <= R; j++){ if(i > j) t1++;//Alice赢的次数 else if(i < j) t2++;//Bob赢的次数,平局对结果无影响不考虑 } double p = t1 * 1.0 / double(t1 + t2);//注意精度 double ans = calc(n, n+m, p);//Alice从开始的n个糖果数到赢得所有n+m的糖果数的概率 printf("%.5fn",ans); } return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算