Giả sử ta có số n và mảng rounds. Đường đua tròn có n sector đánh số 1 đến n. Cuộc đua có m vòng. Vòng i bắt đầu tại rounds[i-1] và kết thúc tại rounds[i]. Tìm các sector được ghé thăm nhiều nhất, sắp xếp tăng dần. (Số sector tăng theo chiều ngược kim đồng hồ)
Ví dụ: n = 4, rounds = [1,3,1,2], kết quả [1, 2].
Thứ tự sector ghé thăm: [1,2,3 (kết thúc vòng 1), 4,1 (kết thúc vòng 2), 2 (kết thúc vòng 3)]. Sector 1 và 2 được ghé 2 lần, sector 3 và 4 chỉ 1 lần.
Giải thuật
d := {}(map sector → số lần ghé)- Khởi tạo
d[j] = 0choj = 1..n d[rounds[0]] = 1- For
itừ 1 đếnlen(rounds)-1:- Nếu
rounds[i] > rounds[i-1]:- For
jtừrounds[i-1]+1đếnrounds[i]:d[j]++
- For
- Ngược lại (qua điểm 0):
- For
jtừrounds[i-1]+1đếnn:d[j]++ - For
jtừ 1 đếnrounds[i]:d[j]++
- For
- Nếu
curr := d[rounds[0]],out := [rounds[0]]- For
itừ 1 đếnn:- Nếu
i != rounds[0]:- Nếu
d[i] > curr:curr = d[i],out = [i] - Ngược lại nếu
d[i] == curr:out.append(i)
- Nếu
- Nếu
- Trả về
sorted(out)
Ví dụ (Python)
def solve(n, rounds):
d = {}
for j in range(1, n+1):
d[j] = 0
d[rounds[0]] = 1
for i in range(1, len(rounds)):
if rounds[i] > rounds[i-1]:
for j in range(rounds[i-1]+1, rounds[i]+1):
d[j] += 1
else:
for j in range(rounds[i-1]+1, n+1):
d[j] += 1
for j in range(1, rounds[i]+1):
d[j] += 1
curr = d[rounds[0]]
out = [rounds[0]]
for i in range(1, n+1):
if i != rounds[0]:
if d[i] > curr:
curr = d[i]
out = [i]
elif d[i] == curr:
out = out + [i]
return sorted(out)
n = 4
rounds = [1, 3, 1, 2]
print(solve(n, rounds))
Input
4, [1,3,1,2]
Output
[1, 2]