import sys def najlepsza_wieza(n, c, klocki): # Sortujemy klocki malejąco po rozmiarze, bo wejście może nie spełniać tego warunku klocki.sort(reverse=True, key=lambda x: x[0]) # Słownik do przechowywania najlepszej oceny dla danej wysokości i wzoru najlepsza_ocena = {} # Przechowujemy najwyższą ocenę max_ocena = 0 for a, w in klocki: nowa_ocena = [] for (wysokosc, wzor), ocena in najlepsza_ocena.items(): # Sprawdzamy, czy nowy klocek można dołożyć if a < wysokosc: kara = c if wzor != w else 0 nowa_ocena.append(((wysokosc + a, w), ocena + a - kara)) max_ocena = max(max_ocena, ocena + a - kara) # Dodajemy przypadek zaczęcia wieży od tego klocka nowa_ocena.append(((a, w), a)) max_ocena = max(max_ocena, a) # Aktualizujemy najlepsze oceny for klucz, ocena in nowa_ocena: if klucz not in najlepsza_ocena or najlepsza_ocena[klucz] < ocena: najlepsza_ocena[klucz] = ocena return max_ocena if __name__ == "__main__": n, c = map(int, sys.stdin.readline().split()) klocki = [tuple(map(int, sys.stdin.readline().split())) for _ in range(n)] print(najlepsza_wieza(n, c, klocki))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import sys def najlepsza_wieza(n, c, klocki): # Sortujemy klocki malejąco po rozmiarze, bo wejście może nie spełniać tego warunku klocki.sort(reverse=True, key=lambda x: x[0]) # Słownik do przechowywania najlepszej oceny dla danej wysokości i wzoru najlepsza_ocena = {} # Przechowujemy najwyższą ocenę max_ocena = 0 for a, w in klocki: nowa_ocena = [] for (wysokosc, wzor), ocena in najlepsza_ocena.items(): # Sprawdzamy, czy nowy klocek można dołożyć if a < wysokosc: kara = c if wzor != w else 0 nowa_ocena.append(((wysokosc + a, w), ocena + a - kara)) max_ocena = max(max_ocena, ocena + a - kara) # Dodajemy przypadek zaczęcia wieży od tego klocka nowa_ocena.append(((a, w), a)) max_ocena = max(max_ocena, a) # Aktualizujemy najlepsze oceny for klucz, ocena in nowa_ocena: if klucz not in najlepsza_ocena or najlepsza_ocena[klucz] < ocena: najlepsza_ocena[klucz] = ocena return max_ocena if __name__ == "__main__": n, c = map(int, sys.stdin.readline().split()) klocki = [tuple(map(int, sys.stdin.readline().split())) for _ in range(n)] print(najlepsza_wieza(n, c, klocki)) |