Description

有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一样?

Solution

挺不错的题!

其实n可以开到1e7

%%lrd真心好题解

思想:

1.26个太多,2个好做。

2.转化成2个?钦定哪一个最后成为最终颜色!这个是白色,剩下都是黑色。

发现问题:

问题1:不一定什么时候都能染成

概率:i/n

问题2:不能之前的f[i]剩下i个白球到全部是同样的颜色。必须都是白色并且都是黑色也不一定都是同样颜色的。

所以f[i]有i个白球,染成都是白色的期望步数

问题3:f[0]怎么定义?正无穷?

其实是条件概率,也就是,对于所有情况(S种),我们把所有最终变成char这种字母的情况拿出来(K种),统计每一个方案的步数,乘上概率(1/K)

再乘上:K/S,这里就是cnt[char]/n

所以其实,f[i]有一个条件,只统计能到达想要的全白状态下的期望步数

所以转移只用考虑“占比”(也就是占x/K),显然(i+1)的概率高,(i-1)的概率低,所以占比就是i+1:i-1

其实本质是条件概率再套条件概率

然后转移方程就列出来了,变成kx+b的形式

至于每次的恒定的g[i],就理解为动一下。动到哪里不关心

#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
double g[N],f[N],k[N],b[N];
int cnt[];
int n;
char s[N];
int main(){
scanf("%s",s+);
n=strlen(s+);
for(reg i=;i<=n;++i) ++cnt[s[i]-'A'];
for(reg i=;i<=n;++i) g[i]=(double)n*(n-)/(i*(n-i))/2.0;
for(reg i=n-;i>=;--i){
k[i]=(i-)/(*i-(i+)*k[i+]);
b[i]=((i+)*b[i+]+(*i*g[i]))/(*i-(i+)*k[i+]);
}
f[]=b[];
// cout<<f[1]<<endl;
for(reg i=;i<=n;++i){
f[i]=k[i]*f[i-]+b[i];
// cout<<f[i]<<endl;
}
double ans=;
for(reg i=;i<;++i){
ans+=(double)cnt[i]/n*f[cnt[i]];
//cout<<cnt[i]<<" "<<f[cnt[i]]<<" "<<ans<<endl;
}
printf("%.1lf",ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/11 22:53:25
*/

算是条件概率的基础应用吧

在条件概率下,只要扣一个条件的概率的帽子,剩下的就是全局的了。

这样我们钦定哪一个成为最终颜色,计算就不重不漏了。

最新文章

  1. Linux中vim的简单配置
  2. Java计算上下基线
  3. Github GUI 托管代码教程
  4. C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
  5. STL中的单向队列queue
  6. bzoj2893
  7. ext中处理Combobox组件点击触发后台事件的问题
  8. CUGBACM_Summer_Tranning 组队赛解题报告
  9. AngularJS 控制器通信
  10. sea.js及三种加载方式的异同
  11. QT 完美实现圆形按钮
  12. Shell-find . -type f -name &quot;*.log&quot; -print0 | xargs -0 rm -f
  13. 2)实现github自动登陆获取信息
  14. spring 之 BeanDefinition &amp; BeanDefinitionParser
  15. python3 installed 安装 pip3
  16. elastalert邮件报警
  17. centos下完全卸载mysql(别人写的,我仅仅为了学习记录)
  18. linux AB web 性能测试工具
  19. DOM-访问元素
  20. ELK搭建实时日志分析平台之一ElasticSearch搭建

热门文章

  1. JavaScript charAt() 方法
  2. @PathVariable
  3. php7函数,声明,返回值等新特性介绍
  4. 简单易懂的softmax交叉熵损失函数求导
  5. 索引使用,分析初探。(explain分析执行计划,以及强制使用force index)
  6. umount -fl用法
  7. 二进制安装MongoDB
  8. 如何快速定位到DBGrid的某一行!!!急...
  9. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)
  10. Angular 2 to Angular 4 with Angular Material UI Components