#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
class Monster
{
private:
int attack_power;
int healing_potion;
int number;
public:
Monster(int attack_power, int healing_potion, int number)
{
this->attack_power = attack_power;
this->healing_potion = healing_potion;
this->number = number + 1;
}
int hit() const
{
return attack_power;
}
int receive_healing_potion() const
{
return this->healing_potion;
}
int get_number() const
{
return this->number;
}
int get_difference() const
{
return this->healing_potion - this->attack_power;
}
};
struct CompareMonsters
{
bool operator()(const Monster &lhs, const Monster &rhs)
{
if(lhs.get_difference() <= 0 && rhs.get_difference() <= 0)
return lhs.receive_healing_potion() < rhs.receive_healing_potion();
else if(lhs.get_difference() > 0 && rhs.get_difference() > 0)
return lhs.hit() > rhs.hit();
else
return lhs.get_difference() < rhs.get_difference();
}
};
int main()
{
int health, n;
int healing_potion, damage;
queue<int> fight_order;
scanf("%d %d", &n, &health);
priority_queue<Monster, vector<Monster>, CompareMonsters> monsters;
for(int i = 0; i < n; ++i)
{
scanf("%d %d", &damage, &healing_potion);
monsters.push(*(new Monster(damage, healing_potion, i)));
}
while(!monsters.empty())
{
health -= monsters.top().hit();
if(health <= 0)
break;
health += monsters.top().receive_healing_potion();
fight_order.push(monsters.top().get_number());
monsters.pop();
}
if(health <= 0)
printf("NIE\n");
else
{
printf("TAK\n");
while(!fight_order.empty())
{
printf("%d ", fight_order.front());
fight_order.pop();
}
}
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 | #include <cstdio> #include <queue> #include <vector> using namespace std; class Monster { private: int attack_power; int healing_potion; int number; public: Monster(int attack_power, int healing_potion, int number) { this->attack_power = attack_power; this->healing_potion = healing_potion; this->number = number + 1; } int hit() const { return attack_power; } int receive_healing_potion() const { return this->healing_potion; } int get_number() const { return this->number; } int get_difference() const { return this->healing_potion - this->attack_power; } }; struct CompareMonsters { bool operator()(const Monster &lhs, const Monster &rhs) { if(lhs.get_difference() <= 0 && rhs.get_difference() <= 0) return lhs.receive_healing_potion() < rhs.receive_healing_potion(); else if(lhs.get_difference() > 0 && rhs.get_difference() > 0) return lhs.hit() > rhs.hit(); else return lhs.get_difference() < rhs.get_difference(); } }; int main() { int health, n; int healing_potion, damage; queue<int> fight_order; scanf("%d %d", &n, &health); priority_queue<Monster, vector<Monster>, CompareMonsters> monsters; for(int i = 0; i < n; ++i) { scanf("%d %d", &damage, &healing_potion); monsters.push(*(new Monster(damage, healing_potion, i))); } while(!monsters.empty()) { health -= monsters.top().hit(); if(health <= 0) break; health += monsters.top().receive_healing_potion(); fight_order.push(monsters.top().get_number()); monsters.pop(); } if(health <= 0) printf("NIE\n"); else { printf("TAK\n"); while(!fight_order.empty()) { printf("%d ", fight_order.front()); fight_order.pop(); } } return 0; } |
English