#include <stdio.h> #include <vector> #include <algorithm> int main(){ long long int p, z; scanf("%lld %lld", &p, &z); int dam, health; std::vector<std::pair<std::pair<int,int>, int> > toSortPlus; std::vector<std::pair<std::pair<int,int>, int> > toSortMinus; for(int i = 0; i < p; i++){ scanf("%d %d", &dam, &health); if (dam >= health) //sortujemy symetrycznie tak jak by byly to wzrosty ale patrzac od konca // naszymi obrazeniami jest zysk zdrowia (czyli w konsekwencji na samym koncu najmniejszy) // a naszym zyskiem zdrowia jest nasza strata czyli roznica i chcemy by na poczatku byla jak najwieksza (czyli w konsekwencji najwiekszy spadek na koncu) toSortMinus.push_back(std::pair<std::pair<int,int>,int> (std::pair<int,int>(health, health - dam), i + 1)); else toSortPlus.push_back(std::pair<std::pair<int,int>,int> (std::pair<int,int>(dam , dam - health), i + 1)); } std::sort(toSortPlus.begin(), toSortPlus.end()); std::sort(toSortMinus.begin(), toSortMinus.end()); for(int i = 0; i < (int)toSortPlus.size(); i++){ if (z <= toSortPlus[i].first.first){ printf("NIE\n"); return 0; } z -= toSortPlus[i].first.second; } for(int i = (int)toSortMinus.size() - 1; i >= 0; i--){ int damTmp = -(toSortMinus[i].first.second - toSortMinus[i].first.first); //printf("%d %d %d\n", damTmp, toSortMinus[i].first.first, toSortMinus[i].first.second); if (z <= damTmp){ //jesli zycie mniejsze od dam printf("NIE\n"); return 0; } z += toSortMinus[i].first.second; //dodajemy health - dam } printf("TAK\n"); for(int i = 0; i < (int)toSortPlus.size(); i++) printf("%d ", toSortPlus[i].second); for(int i = (int)toSortMinus.size() - 1; i >=0; i--) printf("%d ", toSortMinus[i].second); printf("\n"); return 0; }
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 38 39 40 41 42 43 44 | #include <stdio.h> #include <vector> #include <algorithm> int main(){ long long int p, z; scanf("%lld %lld", &p, &z); int dam, health; std::vector<std::pair<std::pair<int,int>, int> > toSortPlus; std::vector<std::pair<std::pair<int,int>, int> > toSortMinus; for(int i = 0; i < p; i++){ scanf("%d %d", &dam, &health); if (dam >= health) //sortujemy symetrycznie tak jak by byly to wzrosty ale patrzac od konca // naszymi obrazeniami jest zysk zdrowia (czyli w konsekwencji na samym koncu najmniejszy) // a naszym zyskiem zdrowia jest nasza strata czyli roznica i chcemy by na poczatku byla jak najwieksza (czyli w konsekwencji najwiekszy spadek na koncu) toSortMinus.push_back(std::pair<std::pair<int,int>,int> (std::pair<int,int>(health, health - dam), i + 1)); else toSortPlus.push_back(std::pair<std::pair<int,int>,int> (std::pair<int,int>(dam , dam - health), i + 1)); } std::sort(toSortPlus.begin(), toSortPlus.end()); std::sort(toSortMinus.begin(), toSortMinus.end()); for(int i = 0; i < (int)toSortPlus.size(); i++){ if (z <= toSortPlus[i].first.first){ printf("NIE\n"); return 0; } z -= toSortPlus[i].first.second; } for(int i = (int)toSortMinus.size() - 1; i >= 0; i--){ int damTmp = -(toSortMinus[i].first.second - toSortMinus[i].first.first); //printf("%d %d %d\n", damTmp, toSortMinus[i].first.first, toSortMinus[i].first.second); if (z <= damTmp){ //jesli zycie mniejsze od dam printf("NIE\n"); return 0; } z += toSortMinus[i].first.second; //dodajemy health - dam } printf("TAK\n"); for(int i = 0; i < (int)toSortPlus.size(); i++) printf("%d ", toSortPlus[i].second); for(int i = (int)toSortMinus.size() - 1; i >=0; i--) printf("%d ", toSortMinus[i].second); printf("\n"); return 0; } |