测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27933. 从A到B我们来做一个数字游戏,通过一系列操作把一个数字 A 变成另一个数字 B。设当前数字是 X,规定每次操作可以从以下 3 种里面选一种进行:- X = X + 1- X = X - 1- X = X × N你的任务就是求出从 A 变成 B 至少需要多少步。输入每组输入包含多个测试用例。先给出一个整数 K(≤ 10),为测试用例的个数。随后 K 行,每行给出一个测试用例的三个整数:A、B、N,…

填空题 较难

题目描述

从A到B

我们来做一个数字游戏,通过一系列操作把一个数字 A 变成另一个数字 B。设当前数字是 X,规定每次操作可以从以下 3 种里面选一种进行:

- X = X + 1

- X = X - 1

- X = X × N

你的任务就是求出从 A 变成 B 至少需要多少步。

输入

每组输入包含多个测试用例。先给出一个整数 K(≤ 10),为测试用例的个数。随后 K 行,每行给出一个测试用例的三个整数:A、B、N,其中 -105 ≤ A, B ≤ 105,1 < N < 10。同行数字间以空格分隔。

输出

对每个测试用例,在一行中输出从 A 变成 B 至少需要多少步。

样例输入

3
3 11 2
-5 -12 3
-2 1000 7

样例输出

3
2
13

样例解释:

第 1 组:(3 × 2 × 2)-1=11

第 2 组:(-5+1) × 3 = -12

第 3 组:(((-2+1+1+1+1+1)×7-1)×7+1+1+1)×7-1 = 1000

参考答案

#include <iostream> #include <queue> #include <unordered_map> using namespace std; int solve(long long A, long long B, int N) { if (A == B) return 0; queue<pair<long long, int>> q; unordered_map<long long, int> visited; q.push({A, 0}); visited[A] = 0; while (!q.empty()) { auto [current, steps] = q.front(); q.pop(); if (current == B) { return steps; } vector<long long> next_values = {current + 1, current - 1, current * N}; for (long long next_val : next_values) { if (next_val == B) { return steps + 1; } if (!visited.count(next_val)) { visited[next_val] = steps + 1; q.push({next_val, steps + 1}); } } } return -1; // 理论上不会执行到这里 } int main() { ios::sync_with_stdio(false); cin.tie(0); int K; cin >> K; while (K--) { long long A, B; int N; cin >> A >> B >> N; cout << solve(A, B, N) << '\n'; } return 0; }
上一题 下一题