#include <iostream> #include <utility> #include <vector> #include <cassert> #include <algorithm> using namespace std; typedef long long LL; struct Monster { int number; LL damage, potion; Monster(int n=0, LL d=0, LL p=0) : number(n), damage(d), potion(p) {} bool operator<(const Monster& other) const { if (damage != other.damage) { return damage < other.damage; } if (potion != other.potion) { return potion < other.potion; } return number < other.number; } }; typedef vector<Monster> VM; bool check(LL &live, VM monsters) { if (live <= 0) { return false; } sort(monsters.begin(), monsters.end()); for (Monster m : monsters) { if (m.damage >= live) { return false; } live = live - m.damage + m.potion; } return true; } void solve() { int n; LL z; assert(2 == scanf("%d%lld", &n, &z)); VM good, bad; LL endLive = z; for (int i = 0; i < n; ++i) { LL d, p; assert(2 == scanf("%lld%lld", &d, &p)); Monster m(i + 1, d, p); endLive = endLive - m.damage + m.potion; if (m.damage < m.potion) { good.push_back(m); } else { bad.push_back(Monster(m.number, m.potion, m.damage)); } } if (check(z, good) and check(endLive, bad)) { printf("TAK\n"); for (Monster m : good) { printf("%d ", m.number); } reverse(bad.begin(), bad.end()); for (Monster m : bad) { printf("%d ", m.number); } printf("\n"); } else { printf("NIE\n"); } } int main() { solve(); 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 | #include <iostream> #include <utility> #include <vector> #include <cassert> #include <algorithm> using namespace std; typedef long long LL; struct Monster { int number; LL damage, potion; Monster(int n=0, LL d=0, LL p=0) : number(n), damage(d), potion(p) {} bool operator<(const Monster& other) const { if (damage != other.damage) { return damage < other.damage; } if (potion != other.potion) { return potion < other.potion; } return number < other.number; } }; typedef vector<Monster> VM; bool check(LL &live, VM monsters) { if (live <= 0) { return false; } sort(monsters.begin(), monsters.end()); for (Monster m : monsters) { if (m.damage >= live) { return false; } live = live - m.damage + m.potion; } return true; } void solve() { int n; LL z; assert(2 == scanf("%d%lld", &n, &z)); VM good, bad; LL endLive = z; for (int i = 0; i < n; ++i) { LL d, p; assert(2 == scanf("%lld%lld", &d, &p)); Monster m(i + 1, d, p); endLive = endLive - m.damage + m.potion; if (m.damage < m.potion) { good.push_back(m); } else { bad.push_back(Monster(m.number, m.potion, m.damage)); } } if (check(z, good) and check(endLive, bad)) { printf("TAK\n"); for (Monster m : good) { printf("%d ", m.number); } reverse(bad.begin(), bad.end()); for (Monster m : bad) { printf("%d ", m.number); } printf("\n"); } else { printf("NIE\n"); } } int main() { solve(); return 0; } |