@impelix

Как решать подобные задачи?

Вы управляете роботом, который находится на стадионе с целочисленной длиной круга. Первоначально
робот находится на линии старт/финиш.
Робот принимает команды “run k”, которая направляет его ровно на k метров против часовой стрелки
относительно его текущей локации и сообщает общее количество пройденных кругов со времени старта
(то есть число пересечений линии старт-финиш после начала забега).
Ваша задача — определить длину круга, используя не более 100 команд.
Первое что приходит на ум - это бинарный поиск, но как прийти к решению и понять что это именно оно, непонятно.
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Во всех таких задачах на запросы почти всегда надо приспособить бинарный поиск.

Так и тут. Перебирайте длину круга бинарным поиском. И запоминайте, сколько метров вы уже прошли и сколько полных кругов получили в ответ.

Вот у вас есть гипотеза m=(l+r)/2 - вы хотите проверить, а как она соотносится с длинной круга. Допустим, вы уже прошли x метров и прошли k полных кругов. Уже только из этой информации можно оценить, какая длина круга может быть. Во-первых, убедитесь, сравните floor(x/m) и k. Если floor(x/m) > k вы уже знаете, что длина круга больше m, ведь для круга длины m и более коротких значений вы бы насчитали floor(x/m) или больше оборотов. Если floor(x/m) < k, то уже очевидно, что длина круга меньше m. Если же floor(x/m) = k, то спросите run m-x%m - сколько осталось пройти до финиша, если бы длина круга была равна m. Если вы получили в ответ 1, то значит круг не длинее m. В протвином случае круг строго длиннее m.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romazhan
1. Установи нижнюю границу длины круга равной 1 и верхнюю границу равной некоторому большому числу, например, 10^9. Можно выбрать любое подходящее значение в качестве верхней границы.
2. Начни бинарный поиск, используя установленные границы. На каждой итерации вычисли среднее значение между нижней и верхней границами длины круга и выполни команду "run k" для этого значения.
3. После каждой команды "run k" проверь, сколько кругов было пройдено с момента старта. Если количество кругов увеличилось, значит, длина круга была занижена, и ты можешь обновить нижнюю границу длины круга до среднего значения.
4. Если количество кругов не изменилось, значит, длина круга была завышена, и ты можешь обновить верхнюю границу длины круга до среднего значения.
5. Повторяй шаги 2-4 до тех пор, пока не будет достигнуто максимальное количество команд (100 в данном случае).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы