[ABC350E] Toward 0 讲解
题目
期望概率题目。
题目简述:
有两种选择:
- 花费
x 元把n 变成\lfloor\frac{n}{a}\rfloor 。 - 花费
y 元,扔一次骰子得到一个数p(1\le p\le 6) ,把n 变成\lfloor\frac{n}{p}\rfloor 。
求花费钱数的期望(不同操作得到的所有钱数的平均值),误差不大于
我们先往暴力的方向想,定义
但是,
这样我们就可以得到
代码:
#include<bits/stdc++.h>
#define int long long
#define inl inline
#define INF LLONG_MAX
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define rer(i,x,y,cmp) for(int i=x;i<=y&&cmp;++i)
#define per(i,x,y) for(int i=x;i>=y;--i)
#define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
int n,a,x,y;
map<int,double>mp;
inl double dfs(int n){
if(n==0) return 0;
if(mp[n]) return mp[n];
double tmp=0;
rep(i,2,6) tmp+=dfs(n/i);
return mp[n]=min((tmp)/5.0+y/5.0*6,dfs(n/a)+x);
}
signed main(){
FAST;
cin>>n>>a>>x>>y;
cout<<fixed<<setprecision(15)<<dfs(n);
return 0;
}