У гонках, в яких гонщики обходять хоча б один виток зігнутої траси, стартові позиції для кожного гонщика розташовані в шаровому порядку, так що кожен гонщик проїжджає однакову відстань навколо доріжки (інакше гонщик у найглибшій смузі матиме величезну перевагу ).
З огляду на довжину головної та другорядної осей (або напівмайорну та напівмалу, якщо ви бажаєте) еліптичної доріжки та кількість смуг у колії, виведіть відстані від початкової точки найпотаємнішої смуги, що стосується кожної смуги руху повинні бути похилими.
Технічні умови
- Кожна смуга являє собою еліпс із напів-магістральними осями на 5 одиниць довше, ніж наступна найкоротша смуга. Для простоти припустимо, що смуги мають 0 ширини.
- Найбільш внутрішня смуга завжди починається з 0, а кожна інша вихідна точка - це додатне ціле число, що більше, або дорівнює попередній вихідній точці.
- Введення та вихід можуть бути у будь-якому зручному та розумному форматі.
- Вхідні дані завжди будуть цілими числами.
- Ви повинні обчислити окружність доріжки до 0,01 одиниць від фактичного значення.
- Вихідні дані повинні бути округлені до найближчого цілого числа (у флорі).
- Фінішна лінія є відправною точкою для найпотаємнішого гонщика. У гонці є лише один круг.
- Довжину осей вимірюють за допомогою найпотаємнішої смуги колії.
- Виведення 0 для зміщення самого внутрішнього смуги необов’язкове.
Випробування
Формат: a, b, n -> <list of offsets, excluding innermost lane>
20, 10, 5 -> 30, 61, 92, 124
5, 5, 2 -> 31
15, 40, 7 -> 29, 60, 91, 121, 152, 183
35, 40, 4 -> 31, 62, 94
Ці тестові випадки були згенеровані за допомогою наступного сценарію Python 3, в якому використовується наближення окружності еліпса, розроблений Рамануджаном:
#!/usr/bin/env python3
import math
a = 35 # semi-major axis
b = 40 # semi-minor axis
n = 4 # number of lanes
w = 5 # spacing between lanes (constant)
h = lambda a,b:(a-b)**2/(a+b)**2
lane_lengths = [math.pi*(a+b+w*i*2)*(1+3*h(a+w*i,b+w*i)/(10+math.sqrt(4-3*h(a+w*i,b+w*i)))) for i in range(n)]
print("{}, {}, {} -> {}".format(a, b, n, ', '.join([str(int(x-lane_lengths[0])) for x in lane_lengths[1:]])))
Використовуване наближення:
Нарешті, ось корисна схема для розуміння обчислень компенсацій:
h**5
, що досить добре 0.01
для широкого діапазону значень.