1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include <iostream>
#include <queue>
#include <vector>
const int INF = 0x3fff'ffff;
int div_11(int x) {
int y = x / 11;
if (x == y * 11) {
return y;
}
return 0;
}
int div_5(int x) {
int y = x / 5;
if (x == y * 5) {
return y;
}
return 0;
}
int plus_1(int x) {
return ++x;
}
int minus_1(int x) {
return --x;
}
class Solution {
public:
int minimumOperationsToMakeEqual(int x, int y) {
if (x <= y) {
return y - x;
}
int nmax = x * 11, tmp;
int (*fcns[])(int) = { div_11, div_5, minus_1, plus_1 };
std::vector<int> dist(nmax + 1, INF);
std::queue<int> q;
q.push(x);
dist[x] = 0;
while (true) {
int u = q.front();
q.pop();
for (auto& f : fcns) {
int v = f(u);
if (v < 1 || v > nmax) {
continue;
}
if (v == y) {
return dist[u] + 1;
}
if (dist[v] == INF) {
dist[v] = dist[u] + 1;
q.push(v);
}
}
}
return -1;
}
};
|