Доброго времени суток! Имеются проблемы с задачей.Предыдущую тему удалил из-за другой проблемы, возникшей с этой задачей. Вот ссылка (задача С, Турнир) Your text to link here...
Вот само условие. Для тех, кто не хочет переходить по ссылке :
В турнире по хоккею участвовало K команд, каждая сыграла с каждой по одному матчу. За победу команда получала 2 очка, за ничью – 1, за поражение – 0 очков.
Известно, сколько очков в итоге получила каждая команда, однако результаты конкретных матчей были утеряны. Требуется восстановить одну из возможных турнирных таблиц. Входные данные
В первой строке входных данных содержится одно натурально число K, не превосходящее 100 – количество команд. Во второй строке задаются через пробел K целых неотрицательных чисел, не превосходящих 2(K–1), – количество очков, набранных командами, занявшими первое, второе, …, K-е места соответственно (то есть каждое следующее число не больше предыдущего). Выходные данные
Выведите турнирную таблицу в следующем формате. Таблица должна состоять из K строк с результатами игр команд, занявших первое, второе, …, последнее место (команды, набравшие одинаковое число очков, могут быть расположены в таблице в любом порядке). В каждой строке должно быть записано K чисел через пробел – количество очков, набранных в игре данной команды с первой, второй, … командами соответственно. Количество очков – это число 0, 1 или 2. В клетках на главной диагонали (соответствующих не существующей игре команды "самой с собой") нужно записать нули.
Гарантируется, что входные данные соответствуют реальному турниру, то есть хотя бы одна таблица, соответствующая входным данным, может быть построена. Если таких таблиц несколько, выведите любую из них.
Я перепробовал множество алгоритмов : максимальный поток, много версий жадных алгоритмов, но максимум беру 70 % баллов.
Полного решения я просто не могу придумать. Может кто поможет с какой идеей?
Идей уже просто не осталось. Если кому-то понадобятся предыдущие исходники мои по этой задаче — то сразу же предоставлю их.
http://ideone.com/aWoCUW
Это жадина.
спасибо. Осталось только разобрать код ... :)
Он предельно простой. На каждой итерации берем чела с мин. очками и он со всеми играет в ничью(пока не кончатся очки)(перебираем противников в порядке возрастания очков). Оставшимся он проигрывает. Конец.
Осталось доказать что у последнего игрока будет 0 очков.
P.S. Как это делать...
Заметим что у игрока с мах очками мы почти всегда протгрываем.(можем сыграть в ничью, только если у всех одно и тоже колтчесво очков). Следовательно у него мы отнимаем по 2 очка на каждой итерации
Заметим что в какой-то момент мах — мин будет менше 2.
Значит в конце все будет гуд по четности.
;)
Здесь было упоминание о потоках — можно и потоками, если лень думать/доказывать жадность, или просто хочется написать поток:)
Из S в каждую игру ребро с пропускной 2, из каждой игры в обе команды ребра с пропускной 2, из каждой команды в T ребро с пропускной score[i]. Таким образом мы удовлетворим требование о том, что каждая команда должна набрать столько-то, а в каждой игре должно быть разыграно ровно 2 балла.