题解:P9789 [ROIR 2020 Day 2] ATM
思路
首先考虑解决前四个子问题,其中
在第一个子问题中,dp
。 用
为了将描述的解决方案衍生到第三个子问题,我们可以在时间负责度中去掉
在第二个子任务中,纸币的面额是
第四个子问题的解决已经更接近于完整的解决方案: 这个子问题中对
正确的解决方案是基于一个贪心算法。让我们对该问题进行反转。设
一方面,
另一方面,假设我们固定
利用这一观察,我们可以在
为了解决最后一组问题,我们可以注意到,没有必要对不同的
代码如下
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)
const int N = 2e5 + 10;
int n, Q, x, a[N], u[N], v[N];
main()
{
scanf("%lld", &n);
rep(i, 1, n) scanf("%lld", &a[i]);
rep(i, 1, n - 1)
{
int t = (a[i + 1] - u[i] - 1) / a[i];
u[i + 1] = u[i] + t * a[i];
v[i + 1] = v[i] + t;
}
scanf("%lld", &Q);
for(; Q; -- Q)
{
scanf("%lld", &x);
int t = upper_bound(a + 1, a + n + 1, x) - a - 1, p = (x - u[t]) / a[t];
printf("%lld %lld\n", u[t] + p * a[t], p + v[t]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步