--- title: "Codeforces Round 769 (Div. 2) C(枚舉)" tags: 題解, 枚舉, 數學 --- https://codeforces.com/contest/1632/problem/C #### 題意 給兩數 $a$, $b$ ($a$ < $b$),有三種操作: - $a$ += 1 - $b$ += 1 - $a$ |= $b$ 問最少多少次操作可以讓 $a$ 和 $b$ 相等。 #### 思路 操作一會讓 $a$ 變大、操作二會讓 $b$ 變大、操作三會讓 $a$ 變成比 $b$ 大或等於 $b$。 若 $a$ 比 $b$ 大,只能做操作二來使其相等。 若 $a$ 比 $b$ 小,則可以調整 $a$ 或 $b$ 使 $b$ 變成 $a$ 的 submask,此時做操作三會讓二者相等。 另一種想法是: 遍歷所有可能的 $a$,對於每個 $a$ 找出最小的 $b$ 使得 $b$ 比原來的 $b$ 大且 $b$ 和 $a$ 在 bits 上差距最小。 做法上可以從高位開始看,遇到 $b$ 的 setbit 時同樣設為 setbit、不是 setbit 的話如果 $a$ 是 setbit 則設為 setbit 並更新答案;如果 $a$ 也不是 setbit 則不設為 setbit,因為往下繼續找可以有更小且滿足條件的 $b$。 #### Code ```python=1 def solve(): A, B = map(int, input().split()) if A > B: print(A - B) return MAXV = A | B ans = B - A for a in range(A, MAXV + 1): if a | B == B: ans = min(ans, (a - A) + 1) for b in range(B, MAXV + 1): if A | b == b: ans = min(ans, (b - B) + 1) print(ans) if __name__ == "__main__": for i in range(int(input())): solve() ``` ```python=1 def solve(): A, B = map(int, input().split()) if A > B: print(A - B) return ans = B - A for a in range(A, B + 1): b = 0 for bit in range(20, -1, -1): if (B >> bit) & 1 == 1: b |= 1 << bit else: if (a >> bit) & 1 == 1: b |= 1 << bit break ans = min(ans, (a - A) + 1 + ((a | b) - B)) print(ans) if __name__ == "__main__": for i in range(int(input())): solve() ```