#include <stdio.h> #include <vector> #include <algorithm> #include <sstream> struct CreatureInfo { CreatureInfo(long idx, long a, long d) : idx(idx), a(a), d(d){} long a; long d; long idx; }; bool CheckSubCollection(std::vector<CreatureInfo>& col, long long& z, std::stringstream& ss) { for(auto& it : col) { z -= it.d; if(z <= 0) { return false; } z += it.a; ss << it.idx << " "; } return true; } int main() { long n, z, a, d; scanf("%ld", &n); scanf("%ld", &z); std::vector<CreatureInfo> positive; positive.reserve(n); std::vector<CreatureInfo> zero; zero.reserve(n); std::vector<CreatureInfo> negative; negative.reserve(n); long long currZ = z; for(int i = 1; i<=n; ++i) { scanf("%ld", &d); scanf("%ld", &a); long result = a - d; currZ += result; if(result < 0) negative.push_back(CreatureInfo(i, a, d)); else if(result == 0) zero.push_back(CreatureInfo(i, a, d)); else positive.push_back(CreatureInfo(i, a, d)); } long long startZ = z; std::stringstream ss; if(currZ <= 0) printf("NIE\n"); else { std::sort( positive.begin(), positive.end(), [&](const CreatureInfo& l, const CreatureInfo& r)->bool { return l.d < r.d; } ); std::sort( negative.begin(), negative.end(), [&](const CreatureInfo& l, const CreatureInfo& r)->bool { if(l.d == r.d) return l.a > r.a; else return l.d > r.d; } ); if( CheckSubCollection(positive, startZ, ss) && CheckSubCollection(zero, startZ, ss) && CheckSubCollection(negative, startZ, ss)) { printf("TAK\n"); printf("%s", ss.str().c_str()); } else printf("NIE\n"); } }
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 | #include <stdio.h> #include <vector> #include <algorithm> #include <sstream> struct CreatureInfo { CreatureInfo(long idx, long a, long d) : idx(idx), a(a), d(d){} long a; long d; long idx; }; bool CheckSubCollection(std::vector<CreatureInfo>& col, long long& z, std::stringstream& ss) { for(auto& it : col) { z -= it.d; if(z <= 0) { return false; } z += it.a; ss << it.idx << " "; } return true; } int main() { long n, z, a, d; scanf("%ld", &n); scanf("%ld", &z); std::vector<CreatureInfo> positive; positive.reserve(n); std::vector<CreatureInfo> zero; zero.reserve(n); std::vector<CreatureInfo> negative; negative.reserve(n); long long currZ = z; for(int i = 1; i<=n; ++i) { scanf("%ld", &d); scanf("%ld", &a); long result = a - d; currZ += result; if(result < 0) negative.push_back(CreatureInfo(i, a, d)); else if(result == 0) zero.push_back(CreatureInfo(i, a, d)); else positive.push_back(CreatureInfo(i, a, d)); } long long startZ = z; std::stringstream ss; if(currZ <= 0) printf("NIE\n"); else { std::sort( positive.begin(), positive.end(), [&](const CreatureInfo& l, const CreatureInfo& r)->bool { return l.d < r.d; } ); std::sort( negative.begin(), negative.end(), [&](const CreatureInfo& l, const CreatureInfo& r)->bool { if(l.d == r.d) return l.a > r.a; else return l.d > r.d; } ); if( CheckSubCollection(positive, startZ, ss) && CheckSubCollection(zero, startZ, ss) && CheckSubCollection(negative, startZ, ss)) { printf("TAK\n"); printf("%s", ss.str().c_str()); } else printf("NIE\n"); } } |