codingame easy puzzle

Aug 01, 2021 12:34

Наткнулся на задачу на codingame - https://www.codingame.com/training/easy/robot-show



Вот мой перевод:

Две комнаты соединены воздуховодом, по которому могут перемещаться роботы-уборщики. Канал узкий, пройти через него может только один робот.

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

Боб считает, что очень интересно наблюдать, как роботы сталкиваются и бегают туда-сюда. Он сделал длинный прозрачный канал и поместил в него много роботов, желая посмотреть последовательность их столкновений и метаний - устроить "robot show". Он расставил роботов на стартовые позиции, а затем включил их всех одновременно.

- предположим, что роботы движутся с постоянной скоростью 1 метр в секунду,
- предположим, что роботы имеют достаточно малый размер, чтобы им можно было пренебречь при расчете пройденного расстояния,
- предположим, что во время robot show дополнительных роботов в служебном канале не появится,
- предположим, что Боб может расположить каждого робота лицом либо влево, либо вправо перед началом шоу ...

Какое самое долгое время, в течение которого роботы могут бегать по воздуховоду, пока все не выйдут?

Пример: в десятиметровом воздуховоде два робота расположены лицом друг к другу.

> <
+-+-+-+-+-+-+-+-+-+-+ init state
0 1 2 3 4 5 6 7 8 9 10

X after 2 sec
+-+-+-+-+-+-+-+-+-+-+ bump at 4, bounce
0 1 2 3 4 5 6 7 8 9 10

< > after 4 sec
+-+-+-+-+-+-+-+-+-+-+ the L bot is exiting
0 1 2 3 4 5 6 7 8 9 10

> after 2 sec
+-+-+-+-+-+-+-+-+-+-+ the R bot is exiting
0 1 2 3 4 5 6 7 8 9 10

Время шоу - 8 секунд

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

Я сначала полез делать таким способом, но потом бросил - при увеличении роботов количество вариантов растет экспоненциально!

К счастью, есть простое наблюдение, которое поможет решить задачу за O(n) от количества роботов. В этом случае решение задачи - несколько строк. Но допереть до него сложновато. Возможно, именно поэтому у этой задачи сложности easy процент успешно решивших всего 67%

Ниже - мое решение. Ключ к решению - в комментарии перед классом, начиная со слов "Ключ к решению"
https://gist.github.com/Manjago/584444337ab9c2cceffd841190da91e2

програмизм

Previous post Next post
Up