题目描述
重返天梯-L3-028 森森旅游 (30 分)原题链接
森森决定从 1 号城市出发,到 n 号城市去。他打算在出发前准备一些现金,并在途中的某个城市将剩余现金 全部 换成旅游金后继续旅游,直到到达 n 号城市为止。当然,他也可以选择在 1 号城市就兑换旅游金,或全部使用现金完成旅程。
对每一次汇率调整,在对应的一行中输出调整后森森至少需要准备多少现金,才能按他的计划从 1 号城市旅行到 n 号城市。
再次提醒:如果森森决定在途中的某个城市兑换旅游金,那么他必须将剩余现金全部、一次性兑换,剩下的旅途将完全使用旅游金支付。
题目分析
刚拿到题目的时候,在分析到底应该在哪个点全部兑换成旅游金。
我们将题目中描述的旅程分为两段,在p点之前,全部使用现金;在p点之后,全部使用旅游金。然后把每个点作为p点遍历一次就好了。
从数据范围判断出,要用堆优化djikstra( O ( m l o g n ) O(mlogn) O(mlogn))
分段计算现金,需要把后半段的旅游金按城市汇率进行上取整转换为现金(a/b=(a+b-1)/b)。用multiset进行维护,动态的删除保留最小值
- s.erase(s.find(xxx))
C++
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair<LL, int> PII; // 距离要开成LL
const int N = 1e5 + 10, M = 200010 * 2; // 双向边
const LL INF = 0x3f3f3f3f3f3f3f3fll;
int n, m, q;
// 双图
int h1[N], h2[N], e[M], ne[M], w[M], idx;
LL dist1[N], dist2

本文解析了一道关于路径规划与货币兑换的题目,介绍了如何通过堆优化Dijkstra算法计算在汇率变动下,从1号城市到n号城市的最低现金准备。涉及动态维护现金上限和旅游金转换,关键在于选择最优兑换点。
最低0.47元/天 解锁文章
1823

被折叠的 条评论
为什么被折叠?



