题目描述
有n盏红灯m盏绿灯,每次随机熄灭一盏,直到一种颜色的灯全部被熄灭,求剩下灯个数的期望。
输入格式
两个整数n和m,分别表示红灯个数和绿灯个数。
输出格式
一个小数,四舍五入保留六位小数。
样例输入
10 20
样例输出
2.294372
一般人思路
上来拿到这个题,wc这不一眼就是记忆化搜索吗
然后10分钟打完,调好,直接寄

可以看到是WA了四个点,再一看数据范围

是1e9的范围,但我代码的复杂度是\(o(n*m)\)的,不炸才怪,所以正解的复杂度要么是\(o(\log_{2}n)\)要么是\(o(1)\),只能靠玄学推式子了
但是话说9G你出的数据怎么回事,说好的80%呢???是不少给我两个测试点(强烈质疑9G造数据能力)
所以我不服,把dp优化了一晚上以后,照样过不了(向出题人妥协),就去请教了一位四川省的神犇,后来又花了半节晚课神犇才帮我把式子推明白
也是被傻逼可爱数学搞破防了,就发愤写了这篇题解
以下是正解
分析
先考虑把所有绿灯熄灭,只剩下k盏红灯,则可以确定最后k盏灯一定为红灯,倒数第k+1盏一定为绿灯,剩下还没有确定的共有n+m-k-1盏灯,其中有n-k个红灯和m-1个绿灯,然后就是熟悉的组合数求概率了
故只剩k盏红灯的概率为
它的贡献的话。。。就再乘上k就好了
所以只剩下红灯的总期望为
要求的式子
怎么化简?
这里用到一个组合数的小性质
可以结合杨辉三角理解一下
但是一眼看去这坨式子里好像并没有可以合并的两项,这时就需要用另一个性质巧妙地转化一下了:
不论n取哪个正整数,总有\(C_{n}^{0}=C_{n+1}^{0}=1\)
所以只要把分子上最后一项变成\(C_{m}^{0}\),就会发现往前每一项都可以合并,而最后有n个\(C_{m}^{0}\),所以合并n次就好了(这种像链式反应一样消掉式子的感觉真是太美妙了)
奇妙的化简
只剩红灯的总期望:
结论
所以,只剩红灯的总期望就是\(\frac{n}{m+1}\)
同理,只剩绿灯的总期望就是\(\frac{m}{n+1}\),两个加起来就是答案
最后直接输出ans$$\frac{n}{m+1}+\frac{m}{n+1}$$
宇宙超级无敌炫酷霹雳霸气AC极简代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;scanf("%d%d",&n,&m);
return printf("%.6lf\n",1.0*n/(m+1)+1.0*m/(n+1)),0;
}
这完全就是一道纯数学题,只要式子推出来就A了
加强版:cats的随机原神
话说我为啥总是把灯打成登
浙公网安备 33010602011771号