签到,如果相等就不用操作;如果 a 是 b 的倍数,则只需要对 b 进行一次操作;否则,需要进行两次操作把 a,b 都变到 LCM。
AC Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<bits/stdc++.h> voidRun(){ int a, b; std::cin >> a >> b; if (a > b) std::swap(a, b); if (a == b) std::cout << 0; elseif (b % a == 0) std::cout << 1; else std::cout << 2; std::cout << "\n"; } intmain(){ int t; std::cin >> t; while (t--) Run(); }
voidRun(){ int n, k; std::cin >> n >> k; std::vector<std::vector<int>> g(n + 1); for (int i = 2; i <= n; ++i) { int p; std::cin >> p; g[p].push_back(i); } std::vector<int> depth(n + 1, 0); std::queue<int> q; q.push(1); depth[1] = 1; std::vector<int> cnt(n + 2, 0); while (!q.empty()) { int u = q.front(); q.pop(); cnt[depth[u]]++; for (int v : g[u]) { depth[v] = depth[u] + 1; q.push(v); } } int Dmin = INT_MAX; for (int u = 1; u <= n; ++u) { if (g[u].empty()) Dmin = std::min(Dmin, depth[u]); } std::vector<int> levels; for (int d = 1; d <= Dmin; ++d) levels.push_back(cnt[d]); sort(levels.begin(), levels.end());
int ans = 0; std::bitset<1005> dp; dp.reset(); dp[0] = 1; int su = 0;
for (int L = 1; L <= (int)levels.size(); ++L) { int x = levels[L - 1]; su += x; dp |= (dp << x); int f = n - su; int low = std::max(0, k - f); int high = std::min(k, su); bool ok = false; if (low <= high) { for (int s = low; s <= high; ++s) { if (dp[s]) { ok = true; break; } } } if (ok) ans = L; } std::cout << ans << '\n'; }
intmain(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T; std::cin >> T; while (T--) Run();
#include<bits/stdc++.h> #define sz(x) int(x.size()) constexprint N = 2e5 + 10; using ll = longlong; using vi = std::vector<int>;
int n, k, depth[N], cnt[N], m; vi g[N], lv, vals, tot, pf;
voidRun(){ std::cin >> n >> k; for (int i = 2, fa; i <= n; i++) std::cin >> fa, g[fa].push_back(i);
[&] { depth[1] = 1; std::queue<int> q; q.push(1);
while (!q.empty()) { int u = q.front(); q.pop(); cnt[depth[u]]++; for (auto v : g[u]) { depth[v] = depth[u] + 1; q.push(v); } } }();
int dmin = INT_MAX; for (int i = 1; i <= n; i++) if (g[i].empty()) dmin = std::min(dmin, depth[i]); for (int d = 1; d <= dmin; d++) lv.push_back(cnt[d]); std::sort(lv.begin(), lv.end());
for (int i = 0; i < sz(lv);) { int j = i; while (j < sz(lv) && lv[i] == lv[j]) j++; vals.push_back(lv[i]); tot.push_back(j - i); i = j; } m = sz(vals);
pf.push_back(0); for (int i = 0; i < m; i++) pf.push_back(pf[i] + tot[i]);
auto check = [&](int M) { if (M == 0) returntrue; vi used(m, 0); int need = M; ll sum = 0; for (int i = 0; i < m; i++) { if (need <= 0) break; int t = std::min(need, tot[i]); used[i] = t; need -= t; sum += 1ll * vals[i] * t; }
ll rest = n - sum;
int l = std::max(0ll, 1ll * k - rest); int r = std::min(1ll * k, sum); if (l > r) returnfalse;
std::bitset<N> dp; dp.reset(); dp.set(0);
for (int i = 0; i < m; i++) { int x = vals[i], u = used[i], p = 1; while (u > 0) { int t = std::min(p, u); int w = x * t; dp |= dp << w; u -= t; p <<= 1; } }
for (int i = l; i <= r; i++) if (dp.test(i)) returntrue; returnfalse; };
int l = -1, r = dmin + 1; while (l + 1 < r) { int mid = l + ((r - l) >> 1); if (check(mid)) l = mid; else r = mid; } std::cout << l << "\n"; }
voidClean(){ for (int i = 1; i <= n; i++) { cnt[i] = 0; g[i].clear(); depth[i] = 0; } lv.clear(), tot.clear(), vals.clear(), pf.clear(); }
intmain(){ std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T; std::cin >> T; while (T--) Run(), Clean(); }