#!/usr/bin/env python3 from itertools import permutations from typing import List, Tuple def nacti_vstup() -> Tuple[int, int, int, List[int], List[List[bool]]]: U, R, B = map(int, input().split()) body = list(map(int, input().split())) def str_to_bool(input: str) -> bool: if input == "1": return True return False resitele = [] for _ in range(R): # načteme řádek, rozdělíme podle mezer, na každý prvek zavoláme funkci str_to_bool vracející bool a to celé zabalíme do listu, který uložíme resitele.append(list(map(str_to_bool, input().split()))) return U, R, B, body, resitele def vypis_vystup(pocet_uspesnych: int, obodovani: Tuple[int, ...]): print(pocet_uspesnych) print(" ".join(map(str, obodovani))) def zjisti_pocet_uspesnych( obodovani: Tuple[int, ...], resitele: List[List[bool]], limit_uspechu: int ) -> int: pocet_uspesnych = 0 # Pro každého řešitele spočítám, kolik by při daném obodování získal bodů a zda by byl úspěšný # Navíc si udržuji počet úspěšných řešitelů při aktuálním obodování for resitel in resitele: ma_bodu = 0 for i, zvladne_ulohu in enumerate(resitel): if zvladne_ulohu: ma_bodu += obodovani[i] if ma_bodu >= limit_uspechu: pocet_uspesnych += 1 return pocet_uspesnych def najdi_nejlepsi_obodovani( B: int, body: List[int], resitele: List[List[bool]] ) -> Tuple[int, Tuple[int, ...]]: nejvic_uspesnych = 0 nej_obodovani = tuple() # Pro každé obodování úloh si spočítáme, kolik dostane každý řešitel bodů. # Pokud bude úspěšných řešitelů více než doposud, uložíme si počet i obodování for obodovani in permutations(body): pocet_uspesnych = zjisti_pocet_uspesnych(obodovani, resitele, B) if pocet_uspesnych > nejvic_uspesnych: nejvic_uspesnych = pocet_uspesnych nej_obodovani = obodovani return nejvic_uspesnych, nej_obodovani def main(): # Načteme vstup, spočítáme nejlepší obodování a vypíšeme výstup _, _, B, body, resitele = nacti_vstup() nejvic_uspesnych, nej_obodovani = najdi_nejlepsi_obodovani(B, body, resitele) vypis_vystup(nejvic_uspesnych, nej_obodovani) if __name__ == "__main__": main()