您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页abc350 E(概率dp)

abc350 E(概率dp)

来源:华拓科技网

今天打abc遇到的记录一下

题目大意:给你一个整数x,你有两种操作

操作1:花费x元,把x变成x/a(a是给定的数字)

操作2:花费y元,把x变成x/b(b是1到6中随机一个数字,概率相等)

问,最少多少米,能让x变0

记dp[i]是当前整数是i时,花费了的钱数

//公式如下,两种情况
//操作1: dp[i] = dp[i/a] + x;
/*操作2:dp[i] = (dp[i] + dp[i/2] + dp[i/3] + dp[i/4] + dp[i/5] + dp[i/6]) / 6 + y;
化简把dp[i]转到一侧(防止死循环)
dp[i]*5/6 = (dp[i] + dp[i/2] + dp[i/3] + dp[i/4] + dp[i/5]) / 6 + y;
dp[i] = y * 6/5 + (dp[i] + dp[i/2] + dp[i/3] + dp[i/4] + dp[i/5])/5;
*/
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
map<ll, double>mp;
ll n,a,x,y;
double dfs(ll t){
    if(t == 0) return 0;
    if(mp[t]) return mp[t];
    double ans1 = dfs(t/a) + x;
    double ans2 = y*6/5.0; 
    for(int i = 2; i <= 6; i++){
        ans2 += dfs(t/i) / 5.0;
    }
    mp[t] = min(ans1, ans2);
    return mp[t];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
    cin>>n>>a>>x>>y;
    cout<<fixed<<setprecision(8)<<dfs(n);
	return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务