#include #include #include #define MAX 1000 #define SWAP(A,B,tmp) tmp = A; A = B; B = tmp; struct nadobi { // jeden kus nádobí int id, t, c, umyt; // číslo; trvanlivost; cena; zda máme naplanováno umytí }; struct nadobi kusy[MAX]; // informace o kusech nádobí int halda[MAX*2],hpocet=0,dny[MAX],pdni; // halda; počet prvků; plány na jednotlivé dny; počet dní int N,tmp; // počet kusů; proměnná pro swap int halda_pridej_prvek(int index) { // přidání prvku do haldy halda[++hpocet] = index; // dáme na konec halda[hpocet*2] = halda[hpocet*2+1] = 0; int i = hpocet; // probubláme prvek nahoru na správné místo while (i > 1 && kusy[halda[i/2]].c < kusy[halda[i]].c) { SWAP(halda[i/2], halda[i], tmp); i /= 2; } } int halda_odeber_maximum() { // odebrání prvku z haldy if (hpocet == 0) return 0; int ret = halda[1]; // vymažeme a prohodíme s posledním prvek halda[1] = halda[hpocet]; halda[hpocet--] = 0; int i = 1; // poslední prvek bubláme dolů, dokud není správně while (kusy[halda[i]].c < kusy[halda[i*2]].c || kusy[halda[i]].c < kusy[halda[i*2+1]].c) { // prohodíme s potomkem, který má větší cenu if (kusy[halda[i*2]].c > kusy[halda[i*2+1]].c) { SWAP(halda[i], halda[i*2], tmp); i = i*2; } else { SWAP(halda[i], halda[i*2+1], tmp); i = i*2+1; } } return ret; } // porovnávací funkce pro qsort int porovnej(const void * a, const void * b) { int ta = ((struct nadobi*) a)->t; int tb = ((struct nadobi*) b)->t; if (ta < tb) return -1; else if (ta == tb) return 0; else return 1; } int main() { scanf("%d", &N); // načteme jednotlivé kusy for (int i = 1; i <= N; i++) { scanf("%d %d", &kusy[i].t, &kusy[i].c); kusy[i].id = i; } kusy[0].c = INT_MIN; // 0. kus plní funkci zarážky // utřídíme podle trvanlivosti (nejtrvanlivější na konec) qsort(&kusy[1], N, sizeof(struct nadobi), porovnej); int i = N; // procházíme dny a určujeme kusy k umytí pdni = N < kusy[N].t ? N : kusy[N].t; for (int t = pdni; t > 0; t--) { // začneme od minima dny/max. trvanlivost while (kusy[i].t >= t) // přidáme nové kusy nádobí halda_pridej_prvek(i--); dny[t] = halda_odeber_maximum(); // vezmeme hladově nejcennější kusy[dny[t]].umyt = 1; } // vypíšeme výsledek for (int i = 1; i <= pdni; i++) if (dny[i]) printf("%d ", kusy[dny[i]].id); for (int i = 1; i <= N; i++) if (!kusy[i].umyt) printf("%d ", kusy[i]); printf("\n"); return 0; }