มีจำนวน n ต้องทำให้เป็น 0 ด้วยการดำเนินการ:
- เลือกบิตขวาสุด (LSB) กลับค่า
- กลับบิตที่ i ถ้าบิต i-1 เป็น 1 และบิต i-2 ถึง 0 เป็น 0 ทั้งหมด
หาจำนวนการดำเนินการน้อยที่สุด
ตัวอย่าง: n=6 (110) ผลลัพธ์ 4 (110→010→011→001→000)
วิธีแก้ปัญหา (Gray Code / Binary Reflection)
- แปลง
nเป็นบิต - สร้าง
mโดย:m[i] = n[i] XOR n[i-1](prefix XOR) - ค่าของ
mในฐานสิบคือคำตอบ
ตัวอย่างโค้ด
def solve(n):
n = list(map(int, bin(n)[2:]))
m = []
last = 0
for d in n:
if last == 1:
d = 1 - d
last = d
m.append(d)
m = ''.join(map(str, m))
return int(m, 2)
n = 6
print(solve(n))
อินพุต
6
เอาต์พุต
4