#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; struct potwor { int i; int koszt; int mod; }; struct comp { bool operator()(const potwor &lhs, const potwor &rhs) const { return lhs.koszt > rhs.koszt; } }; bool comp2(const potwor &lhs, const potwor &rhs) { return lhs.koszt < rhs.koszt; } int main() { int i,n,z,d,a,m; bool daSie=true; vector<potwor> minusy; priority_queue<potwor,vector<potwor>,comp> plusy; vector<int> path; potwor p; vector<potwor>::iterator ptr; cin >> n >> z; minusy.clear(); path.clear(); minusy.clear(); for (i=0; i<n; i++) { cin >> d >> a; p.koszt=d; p.mod=a-d; p.i=i+1; if (p.mod>=0) { plusy.push(p); } else { minusy.push_back(p); } } sort(minusy.begin(),minusy.end(),comp2); while (!(plusy.empty()) && daSie) { p=plusy.top(); plusy.pop(); if (z-p.koszt<1) { daSie=false; } else { path.push_back(p.i); z+=p.mod; } } if (!(minusy.empty()) && daSie) { ptr=(--(minusy.end())); if (true) { m=ptr->koszt; // koszt ostatniego while (!(minusy.empty()) && daSie) { ptr=(--(minusy.end())); if (z-ptr->koszt<1) { daSie=false; } else if (minusy.size()==1) { path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } else if (z+ptr->mod-(--ptr)->koszt<1) { ++ptr; while (z+ptr->mod-m<1 && ptr!=minusy.begin()) { --ptr; } // ptr: dobry / pierwszy if (z+ptr->mod-m>0) { path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } else { daSie=false; } } else { ++ptr; path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } } } } if (daSie) { cout << "TAK\n"; for (i=0; i<path.size(); i++) { cout << path[i] << " "; } cout << endl; } else { cout << "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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; struct potwor { int i; int koszt; int mod; }; struct comp { bool operator()(const potwor &lhs, const potwor &rhs) const { return lhs.koszt > rhs.koszt; } }; bool comp2(const potwor &lhs, const potwor &rhs) { return lhs.koszt < rhs.koszt; } int main() { int i,n,z,d,a,m; bool daSie=true; vector<potwor> minusy; priority_queue<potwor,vector<potwor>,comp> plusy; vector<int> path; potwor p; vector<potwor>::iterator ptr; cin >> n >> z; minusy.clear(); path.clear(); minusy.clear(); for (i=0; i<n; i++) { cin >> d >> a; p.koszt=d; p.mod=a-d; p.i=i+1; if (p.mod>=0) { plusy.push(p); } else { minusy.push_back(p); } } sort(minusy.begin(),minusy.end(),comp2); while (!(plusy.empty()) && daSie) { p=plusy.top(); plusy.pop(); if (z-p.koszt<1) { daSie=false; } else { path.push_back(p.i); z+=p.mod; } } if (!(minusy.empty()) && daSie) { ptr=(--(minusy.end())); if (true) { m=ptr->koszt; // koszt ostatniego while (!(minusy.empty()) && daSie) { ptr=(--(minusy.end())); if (z-ptr->koszt<1) { daSie=false; } else if (minusy.size()==1) { path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } else if (z+ptr->mod-(--ptr)->koszt<1) { ++ptr; while (z+ptr->mod-m<1 && ptr!=minusy.begin()) { --ptr; } // ptr: dobry / pierwszy if (z+ptr->mod-m>0) { path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } else { daSie=false; } } else { ++ptr; path.push_back(ptr->i); z+=ptr->mod; minusy.erase(ptr); } } } } if (daSie) { cout << "TAK\n"; for (i=0; i<path.size(); i++) { cout << path[i] << " "; } cout << endl; } else { cout << "NIE\n"; } return 0; } |