#include #include #include struct Udalost { int x, y; unsigned mesto; unsigned obyvatel; unsigned cas; unsigned predchozi; unsigned skore; // Aby nám dobře fungovalo třídění bool operator <(const Udalost &jina) const { return cas < jina.cas; } }; int main() { // Trocha načítání unsigned pocetUdalosti; scanf("%u", &pocetUdalosti); Udalost *udalosti(new Udalost[pocetUdalosti + 1]); udalosti[0].x = 0; udalosti[0].y = 0; udalosti[0].cas = 0; udalosti[0].predchozi = 0; udalosti[0].skore = 0; for (unsigned i(1); i <= pocetUdalosti; ++ i) { scanf("%d%d%u%u", &udalosti[i].x, &udalosti[i].y, &udalosti[i].obyvatel, &udalosti[i].cas); udalosti[i].mesto = i; } // C++ magie, co to setřídí std::sort(udalosti + 1, udalosti + pocetUdalosti + 1); for (unsigned i(1); i <= pocetUdalosti; ++ i) { unsigned predchozi = -1; unsigned nejlepsiSkore(0); for (unsigned j(0); j < i; ++ j) { if (udalosti[j].predchozi == -1) // Na tuto se nemohl dostavit, ani kdyby se rozkrojil continue; if (udalosti[i].cas - udalosti[j].cas >= abs(udalosti[i].x - udalosti[j].x) + abs(udalosti[i].y - udalosti[j].y) && udalosti[j].skore >= nejlepsiSkore) { nejlepsiSkore = udalosti[j].skore; predchozi = j; } } udalosti[i].predchozi = predchozi; udalosti[i].skore = nejlepsiSkore + udalosti[i].obyvatel; } unsigned nejlepsiSkore(0); unsigned nejlepsiKonec(0); for (unsigned i(1); i <= pocetUdalosti; ++ i) if (udalosti[i].skore > nejlepsiSkore) { nejlepsiSkore = udalosti[i].skore; nejlepsiKonec = i; } unsigned *mesta(new unsigned[pocetUdalosti]); unsigned pocetMest(0); while (nejlepsiKonec) { mesta[pocetMest ++] = nejlepsiKonec; nejlepsiKonec = udalosti[nejlepsiKonec].predchozi; } for (int i(pocetMest - 1); i >= 0; -- i) printf("%u\n", udalosti[mesta[i]].mesto); return 0; }