codeforces 464D
你在玩一个游戏,游戏中有k种装备,每件装备都有一个等级,初始时你拥有每种1级装备各一件
你打算刷n只怪,每刷一只怪之后系统就会随机爆出一件装备
随机方式是先等概率随机装备的种类,设你当前拥有的这种装备的等级为t,则系统会在1~t+1之间等概率随机装备的等级
由于某些原因,你决定只在爆出的装备高于当前装备的等级时换上新装备并卖掉旧装备,否则直接卖掉爆出的装备,卖掉等级为t的装备可以得到t个金币
求你刷n只怪后得到的金币数的期望
n<=10^5,k<=100
题解:
与毛球那个题一样用到每个武器相互独立,互不影响
只要求出每个武器的金币期望,答案就是 它再乘k
我们定义f[i][j]为还剩下i个怪兽没打,当前武器星级为j时的金币期望(这又是一个逆序定义)
f[i][j]= (k-1)/k*f[i-1][j] + 1/k * ( j/(j+1)*(f[i-1][j]+(j+1)/2) + 1/(j+1)*(f[i-1][j+1]+j) )
选了其他武器 选了这个武器 再杀一个怪兽爆 j星 以内的武器 再杀一个怪兽爆了j+1星的武器
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #define mem(a,b) memset(a,b,sizeof(a)) 6 #define dd double 7 using namespace std; 8 9 int n,k; 10 dd f[2][1001]; 11 int nn; 12 13 int main(){ 14 scanf("%d%d",&n,&k); 15 nn=600; 16 int now=0; 17 dd q1,q2,q3; 18 for(int i=1;i<=n;++i) 19 { 20 now^=1; 21 for(int j=1;j<=nn;++j) 22 { 23 q1=(k-1.0)/k*f[now^1][j]; 24 q2=1.0/k*j/(j+1.0)*(f[now^1][j]+(j+1.0)/2); 25 q3=1.0/k*1/(j+1.0)*(f[now^1][j+1]+j); 26 f[now][j]=q1+q2+q3; 27 } 28 } 29 printf("%.10lf",f[now][1]*(dd)k); 30 //while(1); 31 return 0; 32 }