1 条题解
-
0
自动搬运
来自洛谷,原作者为

Nuyoah_awa
事实证明,你没让我失望。搬运于
2025-08-24 22:41:20,当前版本为作者最后更新于2023-04-02 21:37:49,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目分析
小明有一块电子表,准备调时间,M78 星云上一个小时 分钟,小明每次可以往前调 分钟或 分钟,求按照最优策略按键,从一个时间调到另一个时间最多要按多少次。
题目分析
小明从第 分钟调到第 分钟,假设 与 相差 分钟(),我们可以把从第 分钟调到第 分钟看为从第 分钟调到第 分钟,这样题意就简化为了从 开始,调到任意时间最少按多少次。
我们可以把这道题视为一个图论题,我们将每个数 向 和 连边,问题就转化为了求 号节点到每个节点最短路的最大值,然后这道题就可以转换为 求解了。
由于每个点到 的距离最大为 ,就说明即使每回往后调 ,调 次就可以调到所有时间了,所以时间复杂度是 的。
code
#include <iostream> #include <cstdio> #include <queue> using namespace std; const int N = 1e5 + 5; int n, k, t[N], cnt[N], x, y1, y2, ans; queue <int> q; int main() { scanf("%d %d", &n, &k); cnt[0] = true; q.push(0); while(!q.empty()) { x = q.front(); q.pop(); ans = max(ans, t[x]); y1 = (x + k) % n, y2 = (x + 1) % n; if(!cnt[y1]) { t[y1] = t[x] + 1, cnt[y1] = true; q.push(y1); } if(!cnt[y2]) { t[y2] = t[x] + 1, cnt[y2] = true; q.push(y2); } } printf("%d", ans); return 0; }
- 1
信息
- ID
- 5978
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者