题解
2025-07-31 22:44:05
发布于:北京
8阅读
0回复
0点赞
由于操作次数是最少的,可以用广搜解决。
从起点 n 开始,探索所有通过一次操作能到达的节点(n+1, n-1, n*2)。
使用队列来按层级(操作次数)扩展节点,确保最先到达 k 的路径就是最短的。
用一个数组记录每个节点的最少操作次数,避免重复访问。
时间复杂度:O(200000)。
#include <bits/stdc++.h>
using namespace std;
int ans(int n, int k) {
if (n == k) return 0;
//dist数组记录每个数值的最少操作次数,初始化为INT_MAX表示未访问
vector<int> dist(200001, INT_MAX);
queue<int> q;
//广搜,使用队列来按层级(操作次数)扩展节点,确保最先到达 k 的路径就是最短的
//起点
dist[n] = 0;
q.push(n);
while (!q.empty()) {
int a= q.front();
q.pop();
// 尝试三种操作:加1、减1、乘2
vector<int> next= {a+ 1, a- 1, a* 2};
// 遍历三种操作生成的新数值
for (int nx : next) {
if (nx >= 0 && nx <= 200000 && dist[nx] == INT_MAX) {
dist[nx] = dist[a] + 1;
// 如果新数值等于目标 k,直接返回操作次数
if (nx == k) return dist[nx];
q.push(nx);
}
}
}
//如果无法到达k,返回dist[k](理论上不会发生)
return dist[k];
}
int main() {
int n, k;
cin >> n >> k;
cout << ans(n, k);
return 0;
}
这里空空如也
有帮助,赞一个