Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum
题意:一个m个面的骰子,抛掷n次,求这n次里最大值的期望是多少。(看样例就知道)
分析:
m个面抛n次的总的情况是m^n, 开始m==1时,只有一种
现在增加m = 2, 则这些情况是新增的那个的第一次的结果的后面最大的都是新增的,
之前的这些的分支也加上这个数,而且这个数是这一支里最大的,也就是说新增产生的结果
全都是m = 2的这个结果,所以用现在的总的情况减去之前的总的情况。
所以:
最大值是1: 1种
2: 2^n-1
3: 3^n-2^n
.....
m: m^n-(m-1)^n
然后根据求期望的公式乘起来,但是不能直接n次方,比如m^n会严重超出数据类型。
可以分解一下就行了。
所以最后的结果=sum((k/m)^n - ((k-1)/m)^n) (1<=k<=m)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <vector> 7 #include <algorithm> 8 #define LL long long 9 using namespace std; 10 11 int main() 12 { 13 int i; 14 double ans, n, m; 15 while(cin>>m>>n) 16 { 17 ans = pow(1.0/m, n); 18 19 for(i = 2; i <= m; i++) 20 ans += (pow(i/m, n)-pow((i-1)/m, n))*i; 21 22 printf("%.4lf\n", ans); 23 } 24 return 0; 25 }