Сегодня я решил написать квалификацию TCO со своего MacBook Pro. До этого мне такая бредовая затея в голову не приходила, но сегодняшний день оказался для меня богат на подвиги.
За пол часа до начала контеста я понял что у меня в апплете не настроен ExampleBuilder, не установлена idea, не говоря уж о том что отсутствует дефолтный проект в котором решаются задачи. Одновременно с этим пришло осознание того, что на маке я ни разу не писал соревнования, а мой последний СРМ был 2 июля 2009.
Но не беда подумал я. Idea скачалась и установилась быстро, плагин настроился, а проект создался... как раз к началу соревнования.
Первая неприятность подстерегла меня после отрытия 250й задачи. Выяснилось что hotkeys для виндовой intellij idea не работают на маке... Предсказуемый сюрприз. Поэтому первую задачу я сдавал долго и мучительно, и сдалась она за 199.66.
Вторая задача сдалась лучше, за 406.29. Но неприятность поджидала за другим углом. Систем тест выявил, что программа работающая за 90ms на моем макбуке превышает лимит в 2 cекунды на топкодеровской конфигурации. Все дело, видимо, в различиях между ява машинами для mac os и linux, либо в том что topcoder использует linux с 2.4 ядром (хотя во вторую причину верится с трудом). Я конечно понимаю что глупо рассчитывать на оптимизации в JRE, и 200 млн. раз в цикле делать обращения к листу (ans += result.get(result.size() - 1)), тем более что можно вообще обойтись операцией умножения сделав все за O(1). Но тестирование на макбуке перед посылкой показало результат в 90ms именно на этом максимальном тесте, поэтому решение было послано без колебаний. В топкодер арене, естественно, решение на максимальном тесте запущено не было, т.к. подозрения на TL отпали после получения мгновенных ответов на локальном тестировании.
for (int i = 0; i < 2 * 10^8; i++) {
ans += result.get(result.size() - 1);
}
Local: (Mac OS 10.6.3, JRE 1.5 or 1.6 - проверил обе, версия не имеет значения): 100ms
Topcoder (Linux w/2.4 kernel, JRE 1.5.0_03): ~5000ms судя по ответу админов
Обидно блин.
Последняя задача оказалась довольно таки легкой, и бинарный поиск был написан за 10 минут до конца соревнования. Запуск семпл тестов выявил пару неправильных ответов из-за обидного бага, закравшегося в решение. Освоение горячих клавиш для дебага программы оказалось за гранью разумного, поэтому последние 10 минут были потрачены не очень продуктивно. Как водится, баг был найден сразу после окончания соревнования.
В сухом остатке 1 задача вместо положенных 3х, и придется еще раз писать квалификацию. До этого дня мне казалось что такой исход событий невозможен :)
FML
За пол часа до начала контеста я понял что у меня в апплете не настроен ExampleBuilder, не установлена idea, не говоря уж о том что отсутствует дефолтный проект в котором решаются задачи. Одновременно с этим пришло осознание того, что на маке я ни разу не писал соревнования, а мой последний СРМ был 2 июля 2009.
Но не беда подумал я. Idea скачалась и установилась быстро, плагин настроился, а проект создался... как раз к началу соревнования.
Первая неприятность подстерегла меня после отрытия 250й задачи. Выяснилось что hotkeys для виндовой intellij idea не работают на маке... Предсказуемый сюрприз. Поэтому первую задачу я сдавал долго и мучительно, и сдалась она за 199.66.
Вторая задача сдалась лучше, за 406.29. Но неприятность поджидала за другим углом. Систем тест выявил, что программа работающая за 90ms на моем макбуке превышает лимит в 2 cекунды на топкодеровской конфигурации. Все дело, видимо, в различиях между ява машинами для mac os и linux, либо в том что topcoder использует linux с 2.4 ядром (хотя во вторую причину верится с трудом). Я конечно понимаю что глупо рассчитывать на оптимизации в JRE, и 200 млн. раз в цикле делать обращения к листу (ans += result.get(result.size() - 1)), тем более что можно вообще обойтись операцией умножения сделав все за O(1). Но тестирование на макбуке перед посылкой показало результат в 90ms именно на этом максимальном тесте, поэтому решение было послано без колебаний. В топкодер арене, естественно, решение на максимальном тесте запущено не было, т.к. подозрения на TL отпали после получения мгновенных ответов на локальном тестировании.
for (int i = 0; i < 2 * 10^8; i++) {
ans += result.get(result.size() - 1);
}
Local: (Mac OS 10.6.3, JRE 1.5 or 1.6 - проверил обе, версия не имеет значения): 100ms
Topcoder (Linux w/2.4 kernel, JRE 1.5.0_03): ~5000ms судя по ответу админов
Обидно блин.
Последняя задача оказалась довольно таки легкой, и бинарный поиск был написан за 10 минут до конца соревнования. Запуск семпл тестов выявил пару неправильных ответов из-за обидного бага, закравшегося в решение. Освоение горячих клавиш для дебага программы оказалось за гранью разумного, поэтому последние 10 минут были потрачены не очень продуктивно. Как водится, баг был найден сразу после окончания соревнования.
В сухом остатке 1 задача вместо положенных 3х, и придется еще раз писать квалификацию. До этого дня мне казалось что такой исход событий невозможен :)
FML
Я, честно говоря, никаких уроков из вчерашнего участия в квалификации не извлек. Кроме того что нужно все-таки писать в знакомом окружении. Насчет тестирования в арене на максимальном тесте наверное ты прав, но разумно предполагать что значительной разницы между временами выполнения не должно быть, и имеет смысл тестировать в арене на производительность только если локально решение работает "достаточно долго", т.е. например более 0.5 сек. В этот раз это предположение оказалось неверно, но я не припомню других случаев в моей практике когда разница оказывалась столь серьезная - 50X.
А что за процессор на макбуке?
У меня Celeron D 3GHz, Java 1.6 и твое решение на макстесте работает 6.5 -7 секунд. Если поставить ключ -server, то 650 ms :-)
Разница серьезная получается как раз потому, что код неоптимальный.
Процессор 2.4 GHz (T8300) Intel Core 2 Duo, но это не имеет особого значения. Вроде и так понятно что 200 млн. раз взятие последнего элемента коллекции должно работать долго, а 100ms может получиться только в случае сильных оптимизаций.
Вот еще что только нашел:
In 64-bit, there is no client mode, so everyone get's the "server" mode, but with some thresholds tweaked to offer better startup time.
Похоже у меня 64 bit и автоматически включен server mode. Плюс более мощный процессор. И ваши 650ms превращаются в 90-100ms. Разумное объяснение.
ralekseenkov / System / Library / Frameworks / JavaVM.framework / Versions / 1.6 / Home / bin / java - version
javaversion"1.6.017"
Java(TM)SERuntimeEnvironment(build1.6.017 - b04 - 248 - 10M3025)
JavaHotSpot(TM)64 - BitServerVM(build14.3 - b01 - 101, mixedmode)
Аещеятолькочтовыяснилчтовсемоиявыоказываетсяодинаковые:
ralekseenkov ls -l /System/Library/Frameworks/JavaVM.framework/Versions
total 64
lrwxr-xr-x 1 root wheel 10 Dec 5 22:58 1.4 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 Dec 5 22:58 1.4.2 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 Dec 5 22:58 1.5 -> CurrentJDK
lrwxr-xr-x 1 root wheel 10 Dec 5 22:58 1.5.0 -> CurrentJDK
lrwxr-xr-x 1 root wheel 5 Dec 5 22:58 1.6 -> 1.6.0
drwxr-xr-x 7 root wheel 238 Nov 19 11:10 1.6.0
lrwxr-xr-x 1 root wheel 3 Dec 5 22:58 CurrentJDK -> 1.6
Т.е. получается что явы 1.5 у меня в системе и нет. Похоже дело в том что 1.6 действительно лучше оптимизирует код.
Гм. Но я же не пишу, что я не выхожу из второго дива из-за своего макбука или ещё чего-то там. Я просто недостаточно хорошо умею решать задачи на время. А вы просто недостаточно хорошо подготовились к контесту. Но виноват-то макбук, конечно. ;)
2006 год
А как на квалификационный раунд попасть?
Че-то у меня не получилось зарегатся на первый раунд, типа рега шла по приглашениям. Как можно приглашение получить?
Удивительно, казалось бы, корпусу эппловцы уделяют едва ли не больше всего внимания.
Обо что там можно порезаться?