#include <cstdio>
#include <list>
#include <vector>
//#define DEBUG 1
#ifdef DEBUG
#define debug(x...) printf(x)
#else
#define debug(x...)
#endif
class Monster
{
public:
int id;
int d;
int a;
int gain() const { return a-d;}
bool operator < (const Monster & other);
};
//Define gain as a balance between healing fluid and monster damage
//Sorting monsters to get the following order:
//First the ones with non-negative gain, with damage ascending
//Next the ones with negative gain, with heal descending
bool Monster::operator < (const Monster & other)
{
if (this->gain() >= 0 && other.gain() >= 0)
{
return this->d < other.d;
}
else if (this->gain() < 0 && other.gain() >= 0)
{
return false;
}
else if (this->gain() >= 0 && other.gain() < 0)
{
return true;
}
else if (this->gain() < 0 && other.gain() < 0)
{
return this->a > other.a;
}
}
typedef std::list<Monster> MonsterList;
MonsterList monsters;
std::vector<int> monstersOrder;
int main()
{
int n;
long long int z;
scanf("%d %lld", &n, &z);
//Monster *monsters = new Monster [n];
for (int i = 1; i <= n; ++i)
{
Monster tmp;
scanf("%d %d", &(tmp.d), &(tmp.a));
tmp.id = i;
monsters.push_back(tmp);
}
monsters.sort();
#ifdef DEBUG
for (MonsterList::iterator it = monsters.begin(); it != monsters.end(); ++it)
{
printf("{%d: d=%d, a=%d}\n", it->id, it->d, it->a);
}
#endif
while (!monsters.empty())
{
bool found = false;
debug("z = %lld\n", z);
for (MonsterList::iterator it = monsters.begin(); it != monsters.end(); ++it)
{
debug("Checking monster of id=%d...\n", it->id);
if (z - it->d <= 0) continue;
debug("Checking monster of id=%d... OK\n", it->id);
found = true;
monstersOrder.push_back(it->id);
z += it->a - it->d;
monsters.erase(it);
break;
}
if (!found)
{
printf("NIE\n");
return 0;
}
}
printf("TAK\n");
for (std::vector<int>::iterator it = monstersOrder.begin(); it != monstersOrder.end(); ++it)
{
printf("%d ", *it);
}
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 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 | #include <cstdio> #include <list> #include <vector> //#define DEBUG 1 #ifdef DEBUG #define debug(x...) printf(x) #else #define debug(x...) #endif class Monster { public: int id; int d; int a; int gain() const { return a-d;} bool operator < (const Monster & other); }; //Define gain as a balance between healing fluid and monster damage //Sorting monsters to get the following order: //First the ones with non-negative gain, with damage ascending //Next the ones with negative gain, with heal descending bool Monster::operator < (const Monster & other) { if (this->gain() >= 0 && other.gain() >= 0) { return this->d < other.d; } else if (this->gain() < 0 && other.gain() >= 0) { return false; } else if (this->gain() >= 0 && other.gain() < 0) { return true; } else if (this->gain() < 0 && other.gain() < 0) { return this->a > other.a; } } typedef std::list<Monster> MonsterList; MonsterList monsters; std::vector<int> monstersOrder; int main() { int n; long long int z; scanf("%d %lld", &n, &z); //Monster *monsters = new Monster [n]; for (int i = 1; i <= n; ++i) { Monster tmp; scanf("%d %d", &(tmp.d), &(tmp.a)); tmp.id = i; monsters.push_back(tmp); } monsters.sort(); #ifdef DEBUG for (MonsterList::iterator it = monsters.begin(); it != monsters.end(); ++it) { printf("{%d: d=%d, a=%d}\n", it->id, it->d, it->a); } #endif while (!monsters.empty()) { bool found = false; debug("z = %lld\n", z); for (MonsterList::iterator it = monsters.begin(); it != monsters.end(); ++it) { debug("Checking monster of id=%d...\n", it->id); if (z - it->d <= 0) continue; debug("Checking monster of id=%d... OK\n", it->id); found = true; monstersOrder.push_back(it->id); z += it->a - it->d; monsters.erase(it); break; } if (!found) { printf("NIE\n"); return 0; } } printf("TAK\n"); for (std::vector<int>::iterator it = monstersOrder.begin(); it != monstersOrder.end(); ++it) { printf("%d ", *it); } printf("\n"); return 0; } |
English