#include #include #include using namespace std; struct Pozadavek { int id; // identifikační číslo požadavku int priorita; // priorita int termin; // hodina dokončení }; // porovnávání požadavků pro sestupné setřízení dle hodiny dokončení bool operator<(const Pozadavek &p1, const Pozadavek &p2) { return p1.termin > p2.termin; } // porovnávání podle priorit pro haldu bool cmpPriorita(const Pozadavek &p1, const Pozadavek &p2) { return p1.priorita < p2.priorita; } int main() { int N; // počet požadavků vector pozadavky; // pole požadavků vector vysledek; // hodiny vyrábění (pořadí jako na vstupu) scanf("%d", &N); for(int i = 0; i < N; i++) { Pozadavek p; scanf("%d%d", &p.priorita, &p.termin); p.id = i; pozadavky.push_back(p); vysledek.push_back(-1); } sort(pozadavky.begin(), pozadavky.end()); int index = 0; // index požadavku int hodina = pozadavky[0].termin - 1; // zpracovávaná hodina vector halda; // halda řazená dle priority while(hodina >= 0) { if (halda.empty()) { // přeskočíme hodiny, kdy není co vyrábět if (index == N) // vyrobili jsme všechny, break; // můžeme skončit hodina = pozadavky[index].termin - 1; } // vložíme do haldy požadavky, které již lze vyrábět while (index < N && pozadavky[index].termin - 1 == hodina) { halda.push_back(pozadavky[index]); push_heap(halda.begin(), halda.end(), cmpPriorita); index++; } // z haldy vezmeme požadavek s nejvyšší prioritou vysledek[halda.front().id] = hodina; pop_heap(halda.begin(), halda.end(), cmpPriorita); halda.pop_back(); hodina--; } for(int i = 0; i < N; i++) printf("%d ", vysledek[i]); printf("\n"); return 0; }