Giả sử có một vòng tròn gồm các số từ 1 đến N. Ta có hai số A và B. Ta có thể đứng tại bất kỳ vị trí x nào và tính tổng khoảng cách Z = khoảng cách từ x đến A + khoảng cách từ x đến B. Cần chọn x sao cho Z nhỏ nhất (x không trùng với A và B). Trả về giá trị Z nhỏ nhất.
Ví dụ: N = 30, A = 10, B = 20, thì đầu ra là 10 (chọn x = 15, khoảng cách đến A là 5, đến B là 5, tổng = 10).
Giải thuật
Các bước:
- Nếu a > b thì hoán đổi a và b.
- Tính khoảng cách theo chiều kim đồng hồ:
clock_wise_dist = b - a. - Tính khoảng cách ngược chiều kim đồng hồ:
counter_clock_wise_dist = (a - 1) + (n - b + 1). - Lấy
minimum_dist = min(clock_wise_dist, counter_clock_wise_dist). - Nếu minimum_dist == 1 thì trả về 3 (do x không được trùng A, B).
- Trả về minimum_dist.
Ví dụ
def get_min_z(n, a, b):
if a > b:
a, b = b, a
clock_wise_dist = b - a
counter_clock_wise_dist = (a - 1) + (n - b + 1)
minimum_dist = min(clock_wise_dist, counter_clock_wise_dist)
if minimum_dist == 1:
return 3
return minimum_dist
n = 30
a = 10
b = 20
print(get_min_z(n, a, b))Đầu vào
30, 10, 20
Đầu ra
10