/* 2014
* Maciej Szeptuch
* II UWr
*/
#include <cstdio>
#include <algorithm>
using namespace std;
int monsters,
loss[131072], gain[131072],
sortme[131072], s1,
sortme2[131072], s2;
long long life;
bool gainSort(int a, int b);
bool lossSort(int a, int b);
bool check(void);
int main(void)
{
scanf("%d %lld", &monsters, &life);
for(int m = 0; m < monsters; ++ m)
{
scanf("%d %d", &loss[m], &gain[m]);
if(gain[m] - loss[m] >= 0)
sortme[s1 ++] = m;
else
sortme2[s2 ++] = m;
}
sort(sortme, sortme + s1, gainSort);
sort(sortme2, sortme2 + s2, lossSort);
if(check())
{
puts("TAK");
for(int m = 0; m < s1; ++ m)
printf("%d ", sortme[m] + 1);
for(int m = 0; m < s2; ++ m)
printf("%d ", sortme2[m] + 1);
puts("");
}
else
puts("NIE");
return 0;
}
inline
bool gainSort(int a, int b)
{
if(loss[a] < loss[b])
return true;
if(loss[a] > loss[b])
return false;
return gain[a] > gain[b];
}
inline
bool lossSort(int a, int b)
{
if(gain[a] > gain[b])
return true;
if(gain[a] < gain[b])
return false;
return loss[a] > loss[b];
}
inline
bool check(void)
{
// GAIN
for(int m = 0; m < s1; ++ m)
{
life -= loss[sortme[m]];
if(life <= 0)
return false;
life += gain[sortme[m]];
}
// LOSS
for(int m = 0; m < s2; ++ m)
{
life -= loss[sortme2[m]];
if(life <= 0)
return false;
life += gain[sortme2[m]];
}
return life > 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 | /* 2014 * Maciej Szeptuch * II UWr */ #include <cstdio> #include <algorithm> using namespace std; int monsters, loss[131072], gain[131072], sortme[131072], s1, sortme2[131072], s2; long long life; bool gainSort(int a, int b); bool lossSort(int a, int b); bool check(void); int main(void) { scanf("%d %lld", &monsters, &life); for(int m = 0; m < monsters; ++ m) { scanf("%d %d", &loss[m], &gain[m]); if(gain[m] - loss[m] >= 0) sortme[s1 ++] = m; else sortme2[s2 ++] = m; } sort(sortme, sortme + s1, gainSort); sort(sortme2, sortme2 + s2, lossSort); if(check()) { puts("TAK"); for(int m = 0; m < s1; ++ m) printf("%d ", sortme[m] + 1); for(int m = 0; m < s2; ++ m) printf("%d ", sortme2[m] + 1); puts(""); } else puts("NIE"); return 0; } inline bool gainSort(int a, int b) { if(loss[a] < loss[b]) return true; if(loss[a] > loss[b]) return false; return gain[a] > gain[b]; } inline bool lossSort(int a, int b) { if(gain[a] > gain[b]) return true; if(gain[a] < gain[b]) return false; return loss[a] > loss[b]; } inline bool check(void) { // GAIN for(int m = 0; m < s1; ++ m) { life -= loss[sortme[m]]; if(life <= 0) return false; life += gain[sortme[m]]; } // LOSS for(int m = 0; m < s2; ++ m) { life -= loss[sortme2[m]]; if(life <= 0) return false; life += gain[sortme2[m]]; } return life > 0; } |
English