CooperTeam.
Первое полугодие.
Появление. Как и многое великое/хорошее, CTeam появилась по недоразумению. Такой команды не должно было быть.
Для автора даного очерка все началось с решения записаться на некий увлекательный факультатив "Решение задач по программированию". Да... Любил я тогда программировать, более всего - на VisualBasic 5.0. И впоследствии был очень удивлен, что язык этот в ФТШ дикой популярностью не пользуется. Ну ладно, тогда я всего этого не знал. Для образования команды мне нужно было найти двух человек - и после презентации я поймал двух тогда еще слабо знакомых мне одноклассников: Дмитрия Данилова и Сергея Филиппова.
Они действительно были мне слабо знакомы. Это потом они охарактеризуют себя как "Два почетных двоечника ФТШ", и что-то в этом есть, ибо команда AlfaSoft (а я назвал свое детище именно так) вскоре трагически погибла. Но разве можем мы обвинять двух новичков ФТШ в том, что они поддались на уговоры-мольбы-требования новичка тертьего? Меня то есть? Это я затянул их. Каюсь...
Все четыре задачи отборочного тура решал я. И решил, причем здесь не обошлось без драматизма - из 7 дней 5 я пытался что-нибудь сдать, но ничего не вышло, поскольку я совершенно не умел прочесть Input.txt и записать что-нибудь в Output.txt. Но затем меня позвал ЛИЧНО Николай Михайлович Пульцин и доступно объяснил, как это делать. В тот день я впервые лицезрел Linux... И кроме отвращения ничего не испытал.
Последнюю задачу отборочного тура я сдал в 21-55 во вторник, за 5 минут до конца отборочного тура. О, как я был счастлив! А в среду господа Филиппов и Данилов не явились на факультатив. Я стал что-то объяснять Пульцину, но тот мановением руки объединил CooperTeam и AlfaSoft в... CooperTeam. Дело в том, что в CTeam также обнаружился один прогульщик - имя его история (в лице Юры Викторова) умалчивает.
Правила игры. Правило главное - зачет ставится за 50% набранный баллов из числа возможных. Задача должна пройти все 10 тестов. Сдача может осуществляться по Интернету в любой день с 7 до 22 часов. Все задачи оцениваются в одинаковое количество баллов (вначале по 20, во второй четверти по 30, а один тур аж по 40 было!).
20 баллов можно получить на занятии. После занятия в среду - 14, затем в четверг - 13, в пятницу 12 и так далее. Штрафные очки начисляются так: по одному за каждую неудачную попытку. Также можно подать протест, если команда считает, что среди тестов есть неправильный. Если это правда, команда получает двойное количество баллов, которое она могла получить за задачу на тот момент (еще ее программа должна пройти исправленный тест), если нет - отнимается балл.
Первое полугодие. Оно в свою очередь разделялось на две равные части - четверти, то есть. Первую четверть все решенные задачи относились к Юре Викторову. Я приходил, хлопал глазами и упорно пытался понять, что вообще происходит. Были, были наивные попытки что-то написать, но я делал все в лоб. Помню, в одной задаче нужно было вычислить количество вариантов чего-то. Я решил перебрать все варинаты, при каждом варианте увенличивая счетчик на единицу. Ну и тому подобное.
К концу первой четверти мы имели рейтинг 39% при том, что зачет получался при 50%. Я подсчитал, сколько задач нам надо решать, чтобы его получить и ужаснулся. "Как?! Как это сделать?!" Юра Викторов был спокоен, холоден и уверен, что зачета не будет.
В качестве решающего тура я определил #5. Вроде как, вот если удастся переломить ситуацию и получить много баллов, тогда не все еще потеряно. В тот раз все застряло на такой задачке:
Задача 6.4
|
||
Условие | Есть два поля размерами 1xM и 1xN. В левых клетках полей находится по шашке. Двое играют в игру. За один ход игрок может подвинуть вправо на произвольное количество клеток любую из шашек или обе шашки одновременно на одинаковое количество клеток. Выигрывает тот, кто не может сделать очередной ход. Кто выигрывает при правильной игре? | |
Входной файл | Два числа M и N (2 <= M, N <= 1500000), разделенные пробелом, и символ перевода строки. | |
Файл результата | FIRST, если выигрывает первый игрок, SECOND - иначе, и символ перевода строки. | |
Пример 1 | input.txt
3 3output.txt SECOND |
|
Пример 2 | input.txt
4 8output.txt FIRST |
Я с субботы до вторника рисовал матрицы, медленно двигался. А тот тур был последним в четверти, так что задачки можно было сдавать и в среду. И вот в среду я усмотрел связь с количеством нулей и единиц в записи исходных данных в Фибоначчиевой системе счисления. И не успел отладить программу! Я начал отладку в 21 час и не успел. Ужас! Однако надо было продолжать. И мы продолжали.
К 9-му туру у нас был рейтинг 51.4%, а последний, 12 тур, закончили с рейтингом 53.4%. Конечно, здесь прибавилось, в другом месте убавилось. Я, в частности, получил 3 по геометрии и алгебре, поскольку ими занимался халтурно.
Все-таки обучение на собственных ошибках - самый эффективный способ обучения. Только благодаря их обилию мы смогли поднять собственный уровень. А вначале мы постоянно забывали добавить символ перевода строки, путали типы данных и так далее.
Памятные задачи.
Задача 3.1
|
||
Условие | Из клетчатой доски, размером N x M вырезали две клетки. Определите, можно ли оставшуюся часть доски замостить костями домино. | |
Входной файл | В первой строке — натуральные числа N и M (не превосходящие 4000000000) через пробел. Во второй и третьей строках — по 2 числа через пробел, первое от 0 до N-1, второе от 0 до M-1, задающие координаты вырезанных клеток. | |
Файл результата | 1, если замостить оставшуюся часть доски можно, 0 в противном случае, и символ перевода строки. | |
Пример | input.txt
2 3 0 0 0 1output.txt 1 |
Эту задачу я сдавал 10 раз. Мой личный рекорд! Он был побит Юрой Викторовым только во втором полугодии. Я почему-то полагал, что поле 0*0 нельзя замостить доминошками! Вечером мне в ужасе позвонил Юра и потребовал выслать ему образец на тестирование и быстро и доступно объяснил, что я не прав.
Задача 3.2
|
||
Условие | Координаты всех вершин невырожденного треугольника – целые числа. Две вершины заданы, третья выбирается произвольно. Какое наименьшее значение может принимать площадь треугольника? | |
Входной файл | 2 строки, в каждой записано по два целых числа через пробел – координаты вершины по оси X и Y соответственно. Числа не превосходят по модулю 2000000. | |
Файл результата | Вещественное число — площадь треугольника, с одним знаком после десятичной точки, и символ перевода строки. Значение площади округляется в меньшую сторону. | |
Пример | input.txt
2 0 0 4output.txt 1.0 |
Эта задача решалась с помощью теоремы Пика, которая позволяет узнать площадь многоугольника по количеству пересечений его границы с линиями координатной сетки в точках с целочисленными и нецелочислнными координатами. Я такой теоремы не знал, написал программу, которая бегала вдоль прямой XY, и не смог правильно округлить. А долго пытался.
Задача 8.2
|
||
Условие | Определите последнюю ненулевую цифру биномиального коэффициента CNK. | |
Входной файл | Числа N и K через пробел. (0 <= K <= N <= 2000000.) | |
Файл результата | Искомая цифра и символ перевода строки. | |
Пример 1 | input.txt
4 2output.txt 6 |
|
Пример 2 | input.txt
5 1output.txt 5 |
Я долго рисовал эти километровые дроби и в конце концов придумал страшный алгоритм, который выделял числа, оканчивающиеся на 3, 5, 7, 9. Итоговая программа содержала 249 строк. Я послал ее в субботу в 21-30 и она не прошла. По количеству ошибок (обнаруженных в воскресенье с утра) это была рекордная программа. Их было не меньше десятка. И все же я ее отладил. Да... На текущий жизненный момент это самая страшная отладка, которой я занимался.
Результаты первого полугодия:
Команда | Сумма (из 1100) | Рейтинг, % |
Mercykillers | 945 | 85.9 |
DivisionByZero | 940 | 85.5 |
Pioneers | 729 | 66.3 |
Schlangen | 727 | 66.1 |
CooperTeam | 587 | 53.4 |
Daemons | 536 | 48.7 |
Users | 513 | 46.6 |
Kettles | 461 | 41.9 |
Genius | 357 | 32.5 |