dkirienko's blog

By dkirienko, 14 years ago, In Russian

Сегодня в отборочном раунде Google Code Jam была задача A, где требовался стандартный фокус - нужно синхронно отсортировать два списка. В данном случае у нас был список длин дорожек и скоростей перемещения по ним, нужно было отсортировать список дорожек по скорости перемещения, но при этом сохраняя их длины.


На C++ это я бы сделал так: дорожка будет храниться в виде pair <int, int>, где поле first будет равно скорости перемещения по дорожке, поле second будет равно длине дорожки, дальше заводим массив или вектор типа pair <int, int> и стандартная сортировка как раз отсортирует по возрастанию поля first.

Но поскольку писал я на Питоне, а не на C++, то нужно было сделать тот же самый трюк в Питоне. К тому же я уже начал писать решение этой задачи на Питоне, потом понял, что моя первоначальная идея была неправильной и мне как раз нужно была такая "синхронная" сортировка.  Причем желательно было написать быструю сортировку, т.е. воспользоваться стандартной сортировкой. А вот как раз такой "синхронной" сортировкой я никогда в Питоне не пользовался.

Оказалось, можно делать так (конечно, для некоторых это не откровение, но я так не делал никогда). Заведем список из номеров дорожек, т.е. просто список [0, 1, 2, ...]:
Idx = list(range(n + 1))
Также заведем два словаря (dict) V и L, которые будут по ключу (номеру дорожки) возвращать ее скорость и длину. Словари заполняются при считывании данных. А дальше - пишем так:
Idx = sorted(Idx, key = V.get)
То есть вызывается стандартная сортировка для списка Idx, но в качестве ключа передается метод get списка V, который по числу (номеру дорожки) будет возвращать скорость ее движения. В результате список номеров Idx будет отсортирован по возрастанию значения V.get(k) (где k - номер дорожки).

А при чем тут ЕГЭ по информатике? А при том, что в этом году на ЕГЭ по информатике была задача C4, где нужно было сделать что-то подобное. Один (неизвестный мне) московский школьник, написал решение на питоне с таким фокусом. Участвуя в проверке работ неделю назад, я увидел это решение, разобрался в нем и теперь смог увиденный в работе школьника прием использовать при решении задачек Code Jam.

Мораль: ЕГЭ может быть полезно не только школьникам, но и проверяющим работы :)

  • Vote: I like it
  • -1
  • Vote: I do not like it