【BZOJ2554】Color
Description
有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一样?
Input
一行一个字符串,表示球的颜色
Output
一行表示结果,精确到小数点后1位。
Sample Input
AAA
Sample Output
0.0
HINT
数据范围
对于10%的数据,n<=20
对于40%的数据,n<=200
对于50%的数据,n<=1000
对于100% 的数据,n <= 10000
题解:Orz达哥的题解。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn=10010; int n; int cnt[30]; char str[maxn]; double f[maxn],k[maxn],b[maxn]; double ans; int main() { scanf("%s",str),n=strlen(str); int i; k[1]=1; for(i=1;i<n;i++) { k[i+1]=(k[i]-(i-1)/2.0/i*k[i-1])*2.0*i/(i+1); b[i+1]=(b[i]-(i-1)/2.0/i*b[i-1]-n*(n-1)/2.0/i/(n-i))*2.0*i/(i+1); } f[1]=-b[n]/k[n]; for(i=1;i<n;i++) f[i]=k[i]*f[1]+b[i]; for(i=0;i<n;i++) cnt[str[i]-'A']++; for(i=0;i<26;i++) ans+=f[cnt[i]]*cnt[i]/n; printf("%.1lf",ans); return 0; }