nq1s788

Тренировки разбор

Oct 26th, 2025
1,049
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.15 KB | None | 0 0
  1. Давайте представим последовательность команд, в которых играл каждый игрок, как бинарную строку. Например: если игрок играл сначала в первой, потом во второй, потом снова в первой то можем записать его серию игр как 010 (0 -- играл в первой команде, 1 -- играл во второй команде). В каком случае два игрока сыграют в разных командах хотя бы один раз? Если их бинарные строки отличаются хотя бы на один бит (в одном числе).
  2. У нас есть n игроков, мы хотим чтобы любая пара игроков сыграла хотя-бы один раз в разных командах, значит мы хотим, чтобы все n бинарных строки были различные.
  3. Нам нужно минимальное кол-во игр, значит нам нужно понять, какой минимальной длины могут быть n строк так, чтобы они были разными. Чтобы найти эту длину, давайте посмотрим как соотносится максимальное кол-во строк и их длина. Если у нас длина 1, мы можем взять 2 различные бинарные строки, если длина 2, то 4, если длина k, то 2**k. Получается минимальное кол-во игр, это минимальное k, такое что 2**k >= n. Итого находим что нам нужно ceil(log n) игр.
  4.  
  5. Теперь, как нам распределить игроков по командам в эти ceil(log n) игр? Как один из вариантов, мы можем поделить их на группы по наличию i-го бита в двоичном представлении их номера (от 1 до n). Несложно доказать, что групп будет так же ceil(log n). Каждую игру поставим i-ю группу в первую команду, остальных во вторую. Это будет гарантировать то, что каждый сыграет с каждым, так как для каждого игрока не найдется такого, что все игры они находятся в одной команде. Это означало бы, что все их биты совпадают, значит совпадают номера.
  6.  
  7. Пример кода на python:
  8. inp = open('input.txt')
  9. n = int(inp.readline())
  10. inp.close()
  11. cnt = 1
  12. out = []
  13. while True:
  14.     arr = []
  15.     for i in range(n):
  16.         if i & cnt:
  17.             arr.append(i + 1)
  18.     if arr:
  19.         out.append(str(len(arr)) + ' ' + ' '.join(map(str, arr)))
  20.         cnt <<= 1
  21.     else:
  22.         break
  23. outp = open('output.txt', 'w')
  24. outp.write(str(len(out))+'\n')
  25. outp.write('\n'.join(out))
  26. outp.close()
Advertisement
Add Comment
Please, Sign In to add comment