#!/usr/bin/python3 # Vzorové řešení k úloze KSP 34-1-3 Pilný student. from heapq import heappush, heappop task_count = int(input()) # celkový počet úkolů tasks_by_deadline = [ [] for i in range(task_count) ] selected_tasks = [] # seznam úkolů, které jsou vybrané ke splnění # Rozdělíme si úkoly do skupin podle deadlinu. # Úkoly s deadlinem větším než je celkový počet úkolů rovnou zařadíme mezi vybrané úkoly. for task_number in range(task_count): points, deadline = map(int, input().split()) if deadline < task_count: tasks_by_deadline[deadline].append((points, task_number)) else: selected_tasks.append((points, task_number)) # Úkoly zpracováváme odzadu (sestupně podle deadlinu). # V maximové haldě si udržujeme množinu úkolů, které jsme zatím nevybrali a které # mají deadline větší nebo roven aktuálně zpracovávanému deadlinu. # V jednom kroku smyčky do haldy přidáme nové úkoly a následně vybreme úkol, # za jehož splnění získáme nejvíce bodů. heap = [] for deadline in reversed(range(len(tasks_by_deadline))): for points, task_number in tasks_by_deadline[deadline]: # Body za úkoly vkládáme do haldy se záporným znaménkem, čímž z minimové haldy # uděláme maximovou. heappush(heap, (-points, task_number)) if heap: selected = heappop(heap) selected_tasks.append((-selected[0], selected[1])) # Spočítáme celkově získaný počet bodů a vypíšeme optimální řešení. # Pro každý úkol si budeme pamatovat v seznamu task_days, kdy ho plánujeme splnit # (pokud vůbec). # Úkoly ze selected_tasks procházíme od konce, neboť úkol s nejkratším deadlinem # se nachází na konci seznamu. task_days = [ -1 for i in range(task_count) ] total_points = 0 for day, (points, task_number) in enumerate(reversed(selected_tasks)): task_days[task_number] = day total_points += points print(total_points) for task_day in task_days: print(task_day)