#include <iostream> #include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; class Monster { public: long nr; long damage; long life; Monster() : nr(0L), damage(0L), life(0L) {} Monster(long n, long d, long l) : nr(n), damage(d), life(l) {} }; struct lowDamage { bool operator() (const Monster& lhc, const Monster& rhc) const { if(lhc.damage < rhc.damage) return true; else if(lhc.damage == rhc.damage) { if(lhc.life > rhc.life) return true; } return false; } }; struct highDamage { bool operator() (const Monster& lhc, const Monster& rhc) const { if(lhc.damage > rhc.damage) return true; else if(lhc.damage == rhc.damage) { if(lhc.life > rhc.life) return true; } return false; } }; multiset<Monster, lowDamage> setCoolMonsters; multiset<Monster, highDamage> setUglyMonsters; vector<long> vecNrs; bool CheckCoolMonsters(long& prevlife) { multiset<Monster, lowDamage>::iterator itCool = setCoolMonsters.begin(); while(itCool != setCoolMonsters.end()) { if(itCool->damage >= prevlife) return false; prevlife += itCool->life; vecNrs.push_back(itCool->nr); ++itCool; } return true; } bool CheckUglyMonsters(long& prevlife) { multiset<Monster, highDamage>::iterator itUgly = setUglyMonsters.begin(); while(itUgly != setUglyMonsters.end()) { if(itUgly->damage >= prevlife) return false; prevlife += itUgly->life; vecNrs.push_back(itUgly->nr); ++itUgly; } return true; } int main(int argc, char* argv[]) { long monsters = 0L; long life = 0L; long cd = 0L; long cl = 0L; scanf("%ld %ld\n", &monsters, &life); vecNrs.reserve(monsters); for (long idx = 1L; idx <= monsters; ++idx) { scanf("%ld %ld\n", &cd, &cl); if(cd <= cl) setCoolMonsters.insert(Monster(idx, cd, cl - cd)); else setUglyMonsters.insert(Monster(idx, cd, cl - cd)); } bool isok = CheckCoolMonsters(life); if(isok) isok = CheckUglyMonsters(life); if(isok) { printf("TAK\n"); vector<long>::const_iterator vit = vecNrs.begin(); while(vit != vecNrs.end()) { cout << *vit << " "; ++vit; } } else printf("NIE\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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include <iostream> #include <cstdio> #include <vector> #include <set> #include <algorithm> using namespace std; class Monster { public: long nr; long damage; long life; Monster() : nr(0L), damage(0L), life(0L) {} Monster(long n, long d, long l) : nr(n), damage(d), life(l) {} }; struct lowDamage { bool operator() (const Monster& lhc, const Monster& rhc) const { if(lhc.damage < rhc.damage) return true; else if(lhc.damage == rhc.damage) { if(lhc.life > rhc.life) return true; } return false; } }; struct highDamage { bool operator() (const Monster& lhc, const Monster& rhc) const { if(lhc.damage > rhc.damage) return true; else if(lhc.damage == rhc.damage) { if(lhc.life > rhc.life) return true; } return false; } }; multiset<Monster, lowDamage> setCoolMonsters; multiset<Monster, highDamage> setUglyMonsters; vector<long> vecNrs; bool CheckCoolMonsters(long& prevlife) { multiset<Monster, lowDamage>::iterator itCool = setCoolMonsters.begin(); while(itCool != setCoolMonsters.end()) { if(itCool->damage >= prevlife) return false; prevlife += itCool->life; vecNrs.push_back(itCool->nr); ++itCool; } return true; } bool CheckUglyMonsters(long& prevlife) { multiset<Monster, highDamage>::iterator itUgly = setUglyMonsters.begin(); while(itUgly != setUglyMonsters.end()) { if(itUgly->damage >= prevlife) return false; prevlife += itUgly->life; vecNrs.push_back(itUgly->nr); ++itUgly; } return true; } int main(int argc, char* argv[]) { long monsters = 0L; long life = 0L; long cd = 0L; long cl = 0L; scanf("%ld %ld\n", &monsters, &life); vecNrs.reserve(monsters); for (long idx = 1L; idx <= monsters; ++idx) { scanf("%ld %ld\n", &cd, &cl); if(cd <= cl) setCoolMonsters.insert(Monster(idx, cd, cl - cd)); else setUglyMonsters.insert(Monster(idx, cd, cl - cd)); } bool isok = CheckCoolMonsters(life); if(isok) isok = CheckUglyMonsters(life); if(isok) { printf("TAK\n"); vector<long>::const_iterator vit = vecNrs.begin(); while(vit != vecNrs.end()) { cout << *vit << " "; ++vit; } } else printf("NIE\n"); return 0; } |