#include<iostream> #include<vector> #include<algorithm> using namespace std; struct tNaPlus { long id; long strata, zysk; bool operator<(const tNaPlus &rhs) const { return strata < rhs.strata; } }; struct tNaMinus { long id; long strata, zysk; bool operator<(const tNaMinus &rhs) const { return zysk < rhs.zysk; } }; int main() { ios_base::sync_with_stdio(0); long n, z; long d, a; vector<tNaPlus> vNaPlus; vector<tNaPlus> vNaZero; vector<tNaMinus> vNaMinus; tNaPlus naPlus; tNaMinus naMinus; long long poziomPoPlusie; long long aktPocz, aktKonc; cin >> n >> z; for(long i = 0; i < n; ++i) { cin >> d >> a; if(d <= a) { naPlus.id = i + 1; naPlus.strata = d; naPlus.zysk = a; if(a == d) vNaZero.push_back(naPlus); else vNaPlus.push_back(naPlus); } else { naMinus.id = i + 1; naMinus.strata = d; naMinus.zysk = a; vNaMinus.push_back(naMinus); } } sort(vNaPlus.begin(), vNaPlus.end()); sort(vNaZero.begin(), vNaZero.end()); sort(vNaMinus.begin(), vNaMinus.end()); /* cout << "naPlus" << endl; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; cout << "naZero" << endl; for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; cout << "naMinus" << endl; for(vector<tNaMinus>::iterator it = vNaMinus.begin(); it != vNaMinus.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; */ poziomPoPlusie = z; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) if(it->strata < poziomPoPlusie) poziomPoPlusie += it->zysk - it->strata; else { cout << "NIE" << endl; return 0; } for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) if(it->strata >= poziomPoPlusie) { cout << "NIE" << endl; return 0; } aktPocz = -1; aktKonc = -1; for(vector<tNaMinus>::iterator it = vNaMinus.begin(); it != vNaMinus.end(); ++it) if(it->zysk < aktKonc) { aktPocz = aktKonc; aktKonc = aktPocz + it->strata - it->zysk; } else { aktPocz = it->zysk; aktKonc = it->strata; } if(aktKonc < poziomPoPlusie) { cout << "TAK" << endl; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) cout << it->id << " "; for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) cout << it->id << " "; for(vector<tNaMinus>::reverse_iterator it = vNaMinus.rbegin(); it != vNaMinus.rend(); ++it) cout << it->id << " "; } else cout << "NIE" << endl; 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 | #include<iostream> #include<vector> #include<algorithm> using namespace std; struct tNaPlus { long id; long strata, zysk; bool operator<(const tNaPlus &rhs) const { return strata < rhs.strata; } }; struct tNaMinus { long id; long strata, zysk; bool operator<(const tNaMinus &rhs) const { return zysk < rhs.zysk; } }; int main() { ios_base::sync_with_stdio(0); long n, z; long d, a; vector<tNaPlus> vNaPlus; vector<tNaPlus> vNaZero; vector<tNaMinus> vNaMinus; tNaPlus naPlus; tNaMinus naMinus; long long poziomPoPlusie; long long aktPocz, aktKonc; cin >> n >> z; for(long i = 0; i < n; ++i) { cin >> d >> a; if(d <= a) { naPlus.id = i + 1; naPlus.strata = d; naPlus.zysk = a; if(a == d) vNaZero.push_back(naPlus); else vNaPlus.push_back(naPlus); } else { naMinus.id = i + 1; naMinus.strata = d; naMinus.zysk = a; vNaMinus.push_back(naMinus); } } sort(vNaPlus.begin(), vNaPlus.end()); sort(vNaZero.begin(), vNaZero.end()); sort(vNaMinus.begin(), vNaMinus.end()); /* cout << "naPlus" << endl; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; cout << "naZero" << endl; for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; cout << "naMinus" << endl; for(vector<tNaMinus>::iterator it = vNaMinus.begin(); it != vNaMinus.end(); ++it) cout << it->id << " " << it->strata << " " << it->zysk << endl; */ poziomPoPlusie = z; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) if(it->strata < poziomPoPlusie) poziomPoPlusie += it->zysk - it->strata; else { cout << "NIE" << endl; return 0; } for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) if(it->strata >= poziomPoPlusie) { cout << "NIE" << endl; return 0; } aktPocz = -1; aktKonc = -1; for(vector<tNaMinus>::iterator it = vNaMinus.begin(); it != vNaMinus.end(); ++it) if(it->zysk < aktKonc) { aktPocz = aktKonc; aktKonc = aktPocz + it->strata - it->zysk; } else { aktPocz = it->zysk; aktKonc = it->strata; } if(aktKonc < poziomPoPlusie) { cout << "TAK" << endl; for(vector<tNaPlus>::iterator it = vNaPlus.begin(); it != vNaPlus.end(); ++it) cout << it->id << " "; for(vector<tNaPlus>::iterator it = vNaZero.begin(); it != vNaZero.end(); ++it) cout << it->id << " "; for(vector<tNaMinus>::reverse_iterator it = vNaMinus.rbegin(); it != vNaMinus.rend(); ++it) cout << it->id << " "; } else cout << "NIE" << endl; return 0; } |