Сегодня в отборочном раунде 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.
Мораль: ЕГЭ может быть полезно не только школьникам, но и проверяющим работы :)









Нда, похоже, что люди, способные просто написать qsort, скоро исчезнут с лица Земли...
UPD: в левом верхнем крае таблицы результатов есть галочка Download Solutions
================================
"Для меня, как учителя, хорошее решение это то, которое просто и понятно."
Как вы находите числа фибоначчи?
По формуле Бине.
http://pastie.org/2021466
UPD: бросился защищать преподавателя, не заметив, что тот уже отписался :-)
Так могло бы выглядеть решение на Java; всё-таки батарейки в библотеке Python помощнее будут:
Не ввязываясь в теоретическую дискуссию "О пользе или вредности Питона или любого другого языка", хотелось бы узнать хронологию лично Вашего знакомства с языками программирования (именно порядок и время, понадобившееся на это) - если у Вас есть, конечно, желание поделится этой автобиографической стороной своего становления на ниве программирования.
a = []
for i in xrange(n):
a.append((f(i), i))
print sorted(a)
А так да, массив пар в питоне отлично сортируется. Причем, даже вполне быстро: 10**5 штук проходят на ура.