#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct monster {
int id, damage, hp;
};
inline bool highFilter (monster * a, monster * b) {
if( a->damage < b->damage || ( a->damage == b->damage && a->hp > b->hp ))
return true;
return false;
}
inline bool lowFilter (monster * a, monster * b) {
if( a->hp > b->hp || ( a->hp == b->hp && a->damage < b->damage ))
return true;
return false;
}
int main() {
int N, HP, i, diff;
scanf("%d %d", &N, &HP);
long possibility = HP;
vector< monster * > highMonsters;
vector< monster * > zeroMonsters;
vector< monster * > lowMonsters;
monster * m;
for(i = 1; i <= N; ++i) {
m = new monster;
m->id = i;
scanf("%d %d", &m->damage, &m->hp);
diff = m->hp - m->damage;
possibility += diff;
if(diff < 0)
lowMonsters.push_back(m);
else if(diff == 0)
zeroMonsters.push_back(m);
else
highMonsters.push_back(m);
}
if(possibility <= 0) {
puts("NIE");
return(0);
}
sort(highMonsters.begin(), highMonsters.end(), highFilter);
sort(lowMonsters.begin(), lowMonsters.end(), lowFilter);
long life = HP;
for (monster* m : highMonsters) {
life -= m->damage;
if(life < 1) {
puts("NIE");
return(0);
}
life += m->hp;
if(life < 1) {
puts("NIE");
return(0);
}
}
for (monster* m : zeroMonsters) {
life -= m->damage;
if(life < 1) {
puts("NIE");
return(0);
}
life += m->hp;
if(life < 1) {
puts("NIE");
return(0);
}
}
for (monster* m : lowMonsters) {
life -= m->damage;
if(life < 1) {
puts("NIE");
return(0);
}
life += m->hp;
if(life < 1) {
puts("NIE");
return(0);
}
}
puts("TAK");
for (monster* m : highMonsters) {
printf("%d ", m->id);
delete m;
}
for (monster* m : zeroMonsters) {
printf("%d ", m->id);
delete m;
}
for (monster* m : lowMonsters) {
printf("%d ", m->id);
delete m;
}
puts("");
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 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; struct monster { int id, damage, hp; }; inline bool highFilter (monster * a, monster * b) { if( a->damage < b->damage || ( a->damage == b->damage && a->hp > b->hp )) return true; return false; } inline bool lowFilter (monster * a, monster * b) { if( a->hp > b->hp || ( a->hp == b->hp && a->damage < b->damage )) return true; return false; } int main() { int N, HP, i, diff; scanf("%d %d", &N, &HP); long possibility = HP; vector< monster * > highMonsters; vector< monster * > zeroMonsters; vector< monster * > lowMonsters; monster * m; for(i = 1; i <= N; ++i) { m = new monster; m->id = i; scanf("%d %d", &m->damage, &m->hp); diff = m->hp - m->damage; possibility += diff; if(diff < 0) lowMonsters.push_back(m); else if(diff == 0) zeroMonsters.push_back(m); else highMonsters.push_back(m); } if(possibility <= 0) { puts("NIE"); return(0); } sort(highMonsters.begin(), highMonsters.end(), highFilter); sort(lowMonsters.begin(), lowMonsters.end(), lowFilter); long life = HP; for (monster* m : highMonsters) { life -= m->damage; if(life < 1) { puts("NIE"); return(0); } life += m->hp; if(life < 1) { puts("NIE"); return(0); } } for (monster* m : zeroMonsters) { life -= m->damage; if(life < 1) { puts("NIE"); return(0); } life += m->hp; if(life < 1) { puts("NIE"); return(0); } } for (monster* m : lowMonsters) { life -= m->damage; if(life < 1) { puts("NIE"); return(0); } life += m->hp; if(life < 1) { puts("NIE"); return(0); } } puts("TAK"); for (monster* m : highMonsters) { printf("%d ", m->id); delete m; } for (monster* m : zeroMonsters) { printf("%d ", m->id); delete m; } for (monster* m : lowMonsters) { printf("%d ", m->id); delete m; } puts(""); return(0); } |
English