chenfy27的刷题记录

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

abc350E Toward 0

给定整数N,每次可以选择支付X元将其除以A并向下取整,或者支付Y元掷筛子,假设点数为i,则将其除以i并向下取整,筛子每次都是等概率出现1-6。问将N变成0需要的最小花费的期望。
1<=N<=1E18; 2<=A<=6; 1<=X,Y<=1E9

分析:当前的期望是所有后续情况期望的概率加权。如果选择方案1,概率为1,花费为X;如果选择方案2,6种情况都对应1/6的概率,表示为dp[u] = (dp[u/1]+dp[u/2]+dp[u/3]+dp[u/4]+dp[u/5]+dp[u/6])/6 + Y,移项整理得dp[u]=(dp[u/1]+dp[u/2]+dp[u/3]+dp[u/4]+dp[u/5]+dp[u/6])/5 + 6Y/5,取二者的较小值作为u的最终期望。

#include <bits/stdc++.h>
using i64 = long long;
void solve() {
i64 N, A, X, Y;
std::cin >> N >> A >> X >> Y;
std::map<i64,double> dp;
auto dfs = [&](auto self, i64 u) -> double {
if (u == 0) {
return 0;
}
auto it = dp.find(u);
if (it != dp.end()) {
return it->second;
}
double &res = dp[u];
double cost1 = X + self(self, u / A);
double cost2 = 1.2 * Y;
for (int i = 2; i <= 6; i++) {
cost2 += 0.2 * self(self, u / i);
}
return res = std::min(cost1, cost2);
};
std::cout << dfs(dfs, N) << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
std::cout << std::fixed << std::setprecision(10);
int t = 1;
while (t--) solve();
return 0;
}

posted on   chenfy27  阅读(9)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示