dalex's blog

By dalex, 13 years ago, In Russian
В последнее время было много непониманий и недовольств текущей системой подсчета очков в соревнованиях и рейтинга, и я постараюсь предложить варианты решения этой проблемы.

Вначале о рейтинге. Сейчас на Codeforces видна инфляция, во всяком случае, мне видна. Это происходит из-за большого количества участников, сыгравших один-два контеста и больше не появлявшихся.
Рассмотрим подробнее: сейчас у нас новый участник неявно получает рейтинг 1500. Как правило, новичков регистрируется гораздо больше, чем опытных программистов, поэтому на первом же своем контесте этот рейтинг сливается. А так как средний рейтинг неизменен, эти очки достаются верхней половине. Если так будет продолжаться, то через пару лет все, кому не лень, станут красными.

Есть такое предложение:
1) Рейтинг у участника появляется только после написания им 5 контестов.
2) Начальный рейтинг участника при этом не полагается 1500. Вместо этого для каждого из первых пяти контестов будем считать для него такой рейтинг, что, обладая им, он не изменил бы его по результатам соревнования.
3) Как только пять контестов пройдет, рейтинг участника становится равным среднему арифметическому пяти чисел, полученных в п.2.
4) При этом при подсчете рейтинга для участников, уже имеющих рейтинг, новички учитываться не должны.

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

Далее, странно, что, скажем, в турнире Manthan последние места слили всего около 50 очков рейтинга. Вот мои мысли об этом.
Рейтинг Эло вроде как из шахмат украден, поэтому почему бы не представить таблицу контеста как таблицу кругового турнира по шахматам? Примем, что участник A обыграл участника B, если он набрал больше очков, и посчитаем рейтинг по всем таким "партиям". При этом коэффициент изменения должен быть очень небольшим, ведь в контестах участвуют более 1000 участников.

Есть ощущение, что текущий расчет ведется как-то по-иному, потому что при описанной выше "шахматной" системе слив рейтинга последним местом должен быть довольно существенным - ведь он проиграл всем, вообще всем, в то время как в соперниках было около 200 участников, равных ему по силам!


Теперь о самом наболевшем: конечно же, о взломах.
Конечно же, если претесты делать покрывающими все мыслимые случаи, то от взломов ничего не останется, и контесты превратятся в ACM. Так что, как и претесты нужны почти полные (это пожелание авторам), нужна и возможность взломов. Но, если посмотреть на результаты последних раундов, то можно увидеть участников, заработавших более 3000 очков на взломах (при этом в последнем контесте задача A, на мой взгляд, была достаточно хорошей). Напомню, что суммарная стоимость задач - 7500. Не кажутся ли вам эти цифры немного несопоставимы? Решаешь на первых минутах A и B, делаешь 30 взломов = почти 4500 очков и ты примерно в топ-20! А если решать все задачи, то, скорее всего, получишь даже меньше, ведь стоимость то убывает.

Я сам на Manthan-е отправил задачу A на 8 минуте, заблокировал, т.к. мои первоначальные тесты она проходила. Потом, минут через 10, я неожиданно понял, что отправил фигню! Открыл комнату и набрал 1000 очков. А стоимость задачки - 500. Ошибся, не сдал задачу, а в итоге набрал на этом в 2 раза больше очков. Не слишком это честно, что-ли.

Все-таки надо что-то менять. Почему-то лучшим выходом мне видится изменение очков за взломы. Тут есть сразу несколько предложений, которые вполне можно и объединить. Они были высказаны уже давно, а я их тут просто объединю.
1) Изменить очки в зависимости от стоимости задачи (сам я проголосую за этот пункт). Например, за удачные взломы по задачам A,B,C,D,Е давать 40, 60, 80, 100, 120 баллов. По-моему, такой подсчет достаточно корректен: 1200 очков за 30 взломов по задаче A вроде бы нормальный результат (30 взломов набирает 1-2 человека за контест), в отличие от 3000 очков. Хочешь получать по 100 баллов - а реши-ка ты сначала задачу D!
2) Уменьшать очки по мере увеличения числа взломов. Например, за первый взлом давать 100% от номинала, за второй - 90%, ......, за десятый и последующие - 10%. Здесь первые взломы будут неплохо поднимать вас вверх в таблице, а последующие - не очень сильно. Получится "поломал сам - дай поломать другим". Или "не дай поломать другим, но получи от этого мало очков". И выбираем, что выгоднее.
3) Изменять количество очков в зависимости от цвета/разности рейтинга. Скажем, за взлом своего цвета давать 100% очков, соседних сверху и снизу - 120% и 80% и т.д.
Или в зависимости от рейтинга: очки = номинал * (1 + (чужой_рейтинг - твой_рейтинг) / 1000).
Что будет: 1500 ломает 2000, получает 150% очков, 1900 ломает 1400 - получает 50% очков. Надо будет еще как-то правильно отнормировать эту формулу, но вообще это смотрится неплохо.
  • Vote: I like it
  • +27
  • Vote: I do not like it