1 条题解
-
0
📝 题目大意
有 个国家,初始持有第 国的货币 单位。对于每个 (),可以花费 单位第 国货币兑换 单位第 国货币,且 。可以进行任意次操作,求最终能获得的第 国货币的最大数量。
💡 解题思路
-
题目分析:
- ,,数据范围大,需要 解法并用
long long存储。 - 兑换只能从 到 ,单向不可逆,且 (兑换不会增值)。
- 所有货币最终必须经过中间国家才能抵达第 国,不存在向后兑换的路径。
- ,,数据范围大,需要 解法并用
-
算法推导:
- 由于兑换是单向的(),留在第 国的货币无法再向前传递,因此最优策略是贪心地将所有能兑换的货币尽可能向前推进。
- 对于每个 ,若 ,则可以进行 次兑换: 减少 , 增加 。
- 依次处理 ,最终 即为答案。
- 没有选择分支,不需要 DP 或回溯,直接模拟即可。
-
边界与细节:
- 当 时,无法兑换,该国的剩余货币被"浪费"(无法到达第 国),直接跳过。
- 使用
long long避免溢出: 最大 ,累计兑换后可能超过 。 - 下标从 开始,与题目描述保持一致,避免混淆。
⏱️ 复杂度分析
- 时间复杂度:,只需一次遍历。
- 空间复杂度:,存储 、、 三个数组。
💻 标准代码 (C++)
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int N; cin >> N; vector<long long> A(N + 1); // 1-indexed,各国货币持有量 for (int i = 1; i <= N; i++) { cin >> A[i]; } vector<long long> S(N), T(N); // S[i], T[i] 对应 i -> i+1 的兑换参数 for (int i = 1; i <= N - 1; i++) { cin >> S[i] >> T[i]; } // 贪心:从第1国到第N-1国,依次将货币尽可能向前兑换 for (int i = 1; i <= N - 1; i++) { if (A[i] >= S[i]) { // 足够支付一次兑换 long long cnt = A[i] / S[i]; // 计算最多可兑换次数 A[i] -= cnt * S[i]; // 扣除付出的货币 A[i + 1] += cnt * T[i]; // 获得目标国货币 } } cout << A[N] << endl; // 最终第N国的货币数量即为答案 return 0; } -
- 1
信息
- ID
- 776
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者