CF464D World of Darkraft - 2 题解
RedLycoris · · 题解
题目大意:
一款游戏中有
题解:
期望 dp
观察到这
令
为什么是 还剩
这个trick在期望题中很常用
考虑转移。
- 正好拿到了这种装备,而且等级为
j+1
卖掉了原有的等级为
- 拿到了这种装备,但等级不为
j+1
那就相当于拿到了又卖了
可能性为
- 拿到了其它装备
可能性为
但发现这个方程的转移是
你想了想,发现这题要求输出的是小数,就打算在这上面动心思。
考虑每一次升级的概率。
从
发现到了后面就很大可能不会再升级了。
所以,我们可以假定一个最大等级
Code:
using namespace std;
int n;
#define ld long double
ld dp[2][1005],k; //滚动了下,防炸空间
inline void solve(){
cin>>n>>k;
int cur=0,pre=1;
for(int i=1;i<=n;++i){
for(int j=1;j<=1000;++j){
dp[cur][j]=0;
dp[cur][j]+=(dp[pre][j+1]+j)/(j+1)/k;
dp[cur][j]+=(dp[pre][j]+(j+1.0)/2.0)*1.0*j/k/(1.0*(j+1));
dp[cur][j]+=(dp[pre][j])*(k-1)/k;
}
swap(cur,pre);
}
cout<<fixed<<setprecision(9)<<dp[pre][1]*k<<'\n';
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T=1;
//cin>>T;
for(;T--;)solve();
return 0;
}