#include <cstdio> #include <vector> #include <algorithm> #include <iostream> #include <string> using namespace std; struct TripleLong { long d; long a; long i; TripleLong(long dt, long at, long it):d(dt),a(at),i(it) {}; }; bool compare(const TripleLong& first, const TripleLong& second) { if (first.d < second.d) return true; else return false; } bool compare2(const TripleLong& first, const TripleLong& second) { if (first.a < second.a) return false; else return true; } int main() { long long z; long n; bool sur = true; scanf("%ld %lld\n", &n, &z); long long trace_suma = 0; vector<TripleLong> trace; vector<TripleLong> zyskuje; vector<long> res; for (long i=1;i<=n;i++) { long d,a; scanf("%ld %ld\n", &d, &a); if (d>a) { trace.push_back(TripleLong(d,a,i)); trace_suma += d-a; } else { zyskuje.push_back(TripleLong(d,a,i)); } } sort(zyskuje.begin(),zyskuje.end(),compare); vector<TripleLong>::const_iterator itr = zyskuje.begin(); while(itr != zyskuje.end()){ if (itr->d >= z) { sur = false; break; } else { z += (-itr->d+itr->a); res.push_back(itr->i); } ++itr; } if (sur) { if (trace_suma >= z) { sur = false; } else { sort(trace.begin(),trace.end(),compare2); vector<TripleLong>::const_iterator itr = trace.begin(); while(itr != trace.end()){ // printf("%ld %ld %ld\n", itr->d,itr->a,itr->i); if (itr->d >= z) { sur = false; break; } else { z += (-itr->d+itr->a); res.push_back(itr->i); } ++itr; } } } if(sur) { printf("TAK\n"); for (int i=0; i<res.size(); i++) { if (i==res.size()-1) { printf("%ld\n", res[i]); } else { printf("%ld ", res[i]); } } } else { printf("NIE\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 | #include <cstdio> #include <vector> #include <algorithm> #include <iostream> #include <string> using namespace std; struct TripleLong { long d; long a; long i; TripleLong(long dt, long at, long it):d(dt),a(at),i(it) {}; }; bool compare(const TripleLong& first, const TripleLong& second) { if (first.d < second.d) return true; else return false; } bool compare2(const TripleLong& first, const TripleLong& second) { if (first.a < second.a) return false; else return true; } int main() { long long z; long n; bool sur = true; scanf("%ld %lld\n", &n, &z); long long trace_suma = 0; vector<TripleLong> trace; vector<TripleLong> zyskuje; vector<long> res; for (long i=1;i<=n;i++) { long d,a; scanf("%ld %ld\n", &d, &a); if (d>a) { trace.push_back(TripleLong(d,a,i)); trace_suma += d-a; } else { zyskuje.push_back(TripleLong(d,a,i)); } } sort(zyskuje.begin(),zyskuje.end(),compare); vector<TripleLong>::const_iterator itr = zyskuje.begin(); while(itr != zyskuje.end()){ if (itr->d >= z) { sur = false; break; } else { z += (-itr->d+itr->a); res.push_back(itr->i); } ++itr; } if (sur) { if (trace_suma >= z) { sur = false; } else { sort(trace.begin(),trace.end(),compare2); vector<TripleLong>::const_iterator itr = trace.begin(); while(itr != trace.end()){ // printf("%ld %ld %ld\n", itr->d,itr->a,itr->i); if (itr->d >= z) { sur = false; break; } else { z += (-itr->d+itr->a); res.push_back(itr->i); } ++itr; } } } if(sur) { printf("TAK\n"); for (int i=0; i<res.size(); i++) { if (i==res.size()-1) { printf("%ld\n", res[i]); } else { printf("%ld ", res[i]); } } } else { printf("NIE\n"); } return 0; } |