#include <cstdio> #include <vector> #include <algorithm> using namespace std; struct walka { int d, a, i; walka(int dd, int aa, int ii) : d(dd), a(aa), i(ii) { } }; bool comp1(walka* e1, walka *e2) { return e1->d < e2->d; } bool comp2(walka* e1, walka *e2) { return e1->a > e2->a; } int main(){ int n; long long int z; //100 000 potworow * 100 000 punktow zdrowia int d, a; vector<walka*> dodatnie; vector<walka*> ujemne; scanf("%d %lld\n", &n, &z); for(int i=1; i<=n; ++i) { scanf("%d %d\n", &d, &a); if(d < a) { dodatnie.push_back(new walka(d, a, i)); } else { ujemne.push_back(new walka(d, a, i)); } } sort(dodatnie.begin(), dodatnie.end(), comp1); sort(ujemne.begin(), ujemne.end(), comp2); /*printf("================\n"); for(int i=0; i<dodatnie.size(); ++i) { printf("%d %d %d\n", dodatnie[i]->d, dodatnie[i]->a, dodatnie[i]->i); } printf("----------------\n"); for(int i=0; i<ujemne.size(); ++i) { printf("%d %d %d\n", ujemne[i]->d, ujemne[i]->a, ujemne[i]->i); } printf("================\n");*/ if(dodatnie.size() && z <= dodatnie[0]->d) { printf("NIE\n"); return 0; } for(vector<walka*>::iterator it = dodatnie.begin(); it!=dodatnie.end(); ++it) { z += (*it)->a - (*it)->d; } for(vector<walka*>::iterator it = ujemne.begin(); it!=ujemne.end(); ++it) { if(z <= (*it)->d) { printf("NIE\n"); return 0; } else { z += (*it)->a - (*it)->d; } } printf("TAK\n"); for(vector<walka*>::iterator it = dodatnie.begin(); it!=dodatnie.end(); ++it) { printf("%d ", (*it)->i); } for(vector<walka*>::iterator it = ujemne.begin(); it!=ujemne.end(); ++it) { printf("%d ", (*it)->i); } printf("\n"); //printf("%lld\n", z); }
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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct walka { int d, a, i; walka(int dd, int aa, int ii) : d(dd), a(aa), i(ii) { } }; bool comp1(walka* e1, walka *e2) { return e1->d < e2->d; } bool comp2(walka* e1, walka *e2) { return e1->a > e2->a; } int main(){ int n; long long int z; //100 000 potworow * 100 000 punktow zdrowia int d, a; vector<walka*> dodatnie; vector<walka*> ujemne; scanf("%d %lld\n", &n, &z); for(int i=1; i<=n; ++i) { scanf("%d %d\n", &d, &a); if(d < a) { dodatnie.push_back(new walka(d, a, i)); } else { ujemne.push_back(new walka(d, a, i)); } } sort(dodatnie.begin(), dodatnie.end(), comp1); sort(ujemne.begin(), ujemne.end(), comp2); /*printf("================\n"); for(int i=0; i<dodatnie.size(); ++i) { printf("%d %d %d\n", dodatnie[i]->d, dodatnie[i]->a, dodatnie[i]->i); } printf("----------------\n"); for(int i=0; i<ujemne.size(); ++i) { printf("%d %d %d\n", ujemne[i]->d, ujemne[i]->a, ujemne[i]->i); } printf("================\n");*/ if(dodatnie.size() && z <= dodatnie[0]->d) { printf("NIE\n"); return 0; } for(vector<walka*>::iterator it = dodatnie.begin(); it!=dodatnie.end(); ++it) { z += (*it)->a - (*it)->d; } for(vector<walka*>::iterator it = ujemne.begin(); it!=ujemne.end(); ++it) { if(z <= (*it)->d) { printf("NIE\n"); return 0; } else { z += (*it)->a - (*it)->d; } } printf("TAK\n"); for(vector<walka*>::iterator it = dodatnie.begin(); it!=dodatnie.end(); ++it) { printf("%d ", (*it)->i); } for(vector<walka*>::iterator it = ujemne.begin(); it!=ujemne.end(); ++it) { printf("%d ", (*it)->i); } printf("\n"); //printf("%lld\n", z); } |