Блог пользователя zamazan4ik

Автор zamazan4ik, 9 лет назад, По-русски

Доброго времени суток! Имеются проблемы с задачей.Предыдущую тему удалил из-за другой проблемы, возникшей с этой задачей. Вот ссылка (задача С, Турнир) Your text to link here...

Вот само условие. Для тех, кто не хочет переходить по ссылке :

В турнире по хоккею участвовало K команд, каждая сыграла с каждой по одному матчу. За победу команда получала 2 очка, за ничью – 1, за поражение – 0 очков.

Известно, сколько очков в итоге получила каждая команда, однако результаты конкретных матчей были утеряны. Требуется восстановить одну из возможных турнирных таблиц. Входные данные

В первой строке входных данных содержится одно натурально число K, не превосходящее 100 – количество команд. Во второй строке задаются через пробел K целых неотрицательных чисел, не превосходящих 2(K–1), – количество очков, набранных командами, занявшими первое, второе, …, K-е места соответственно (то есть каждое следующее число не больше предыдущего). Выходные данные

Выведите турнирную таблицу в следующем формате. Таблица должна состоять из K строк с результатами игр команд, занявших первое, второе, …, последнее место (команды, набравшие одинаковое число очков, могут быть расположены в таблице в любом порядке). В каждой строке должно быть записано K чисел через пробел – количество очков, набранных в игре данной команды с первой, второй, … командами соответственно. Количество очков – это число 0, 1 или 2. В клетках на главной диагонали (соответствующих не существующей игре команды "самой с собой") нужно записать нули.

Гарантируется, что входные данные соответствуют реальному турниру, то есть хотя бы одна таблица, соответствующая входным данным, может быть построена. Если таких таблиц несколько, выведите любую из них.

Я перепробовал множество алгоритмов : максимальный поток, много версий жадных алгоритмов, но максимум беру 70 % баллов.

Полного решения я просто не могу придумать. Может кто поможет с какой идеей?

Идей уже просто не осталось. Если кому-то понадобятся предыдущие исходники мои по этой задаче — то сразу же предоставлю их.

  • Проголосовать: нравится
  • -27
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

http://ideone.com/aWoCUW

Это жадина.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    спасибо. Осталось только разобрать код ... :)

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Он предельно простой. На каждой итерации берем чела с мин. очками и он со всеми играет в ничью(пока не кончатся очки)(перебираем противников в порядке возрастания очков). Оставшимся он проигрывает. Конец.

      Осталось доказать что у последнего игрока будет 0 очков.

      P.S. Как это делать...

      Заметим что у игрока с мах очками мы почти всегда протгрываем.(можем сыграть в ничью, только если у всех одно и тоже колтчесво очков). Следовательно у него мы отнимаем по 2 очка на каждой итерации

      Заметим что в какой-то момент мах — мин будет менше 2.

      Значит в конце все будет гуд по четности.

      ;)

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Здесь было упоминание о потоках — можно и потоками, если лень думать/доказывать жадность, или просто хочется написать поток:)

      Из S в каждую игру ребро с пропускной 2, из каждой игры в обе команды ребра с пропускной 2, из каждой команды в T ребро с пропускной score[i]. Таким образом мы удовлетворим требование о том, что каждая команда должна набрать столько-то, а в каждой игре должно быть разыграно ровно 2 балла.