#include <cstdio>
#include <stack>
const unsigned int zmax=100000;
const unsigned int nmax=100000;
struct monster {
unsigned int monsterid;
unsigned int monsterpower;
unsigned int healthpack;
int lifegain;
bool type;
};
void quicksort(monster*,int,int);
unsigned int divide(monster*,int,int);
int main() {
unsigned int z,n,pwr,hp;
long long int life;
std::stack <unsigned int> st1,st2;
monster monsters[nmax];
scanf("%d",&n);
scanf("%d",&z);
life = z;
for(int i=0; i<n; i++) {
scanf("%u %u",&pwr,&hp);
monsters[i].monsterid=i+1;
monsters[i].monsterpower=pwr;
monsters[i].healthpack=hp;
monsters[i].lifegain=hp-pwr;
if (monsters[i].lifegain>=0) monsters[i].type=true;
else monsters[i].type=false;
}
bool ispossible=true;
quicksort(monsters,0,n-1);
/* for(int i=0; i<n; i++) {
printf("Monster id: %u, monster power: %u, health pack: %u, life gain: %d\n",monsters[i].monsterid,monsters[i].monsterpower,monsters[i].healthpack,monsters[i].lifegain);
}*/
for(int i=0; i<n; i++) if(monsters[i].type) {
if(life>monsters[i].monsterpower) {
life+=monsters[i].lifegain;
st1.push(monsters[i].monsterid);
} else {
ispossible=false;
break;
}
}
if(ispossible) for(int i=n-1; i>=0; i--) if(!monsters[i].type) {
if(life>monsters[i].monsterpower) {
life+=monsters[i].lifegain;
st1.push(monsters[i].monsterid);
} else {
ispossible=false;
break;
}
}
if (ispossible) {
printf("TAK\n");
while(!st1.empty()) {
st2.push(st1.top());
st1.pop();
}
while(!st2.empty()) {
printf("%u ",st2.top());
st2.pop();
}
} else {
printf("NIE");
}
return 0;
}
void quicksort(monster* tab, int s, int e) {
if (s<e) {
unsigned int p = divide(tab,s,e);
quicksort(tab,s,p-1);
quicksort(tab,p+1,e);
}
}
unsigned int divide(monster* tab, int s, int e) {
monster temp;
int i,j;
i=s;
j=e-1;
while(i<j) {
while((tab[i].monsterpower<=tab[e].monsterpower)&&(i<j)) i++;
while((tab[j].monsterpower>tab[e].monsterpower)&&(i<j)) j--;
temp=tab[i];
tab[i]=tab[j];
tab[j]=temp;
}
temp=tab[j];
tab[j]=tab[e];
tab[e]=temp;
return j;
}
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 | #include <cstdio> #include <stack> const unsigned int zmax=100000; const unsigned int nmax=100000; struct monster { unsigned int monsterid; unsigned int monsterpower; unsigned int healthpack; int lifegain; bool type; }; void quicksort(monster*,int,int); unsigned int divide(monster*,int,int); int main() { unsigned int z,n,pwr,hp; long long int life; std::stack <unsigned int> st1,st2; monster monsters[nmax]; scanf("%d",&n); scanf("%d",&z); life = z; for(int i=0; i<n; i++) { scanf("%u %u",&pwr,&hp); monsters[i].monsterid=i+1; monsters[i].monsterpower=pwr; monsters[i].healthpack=hp; monsters[i].lifegain=hp-pwr; if (monsters[i].lifegain>=0) monsters[i].type=true; else monsters[i].type=false; } bool ispossible=true; quicksort(monsters,0,n-1); /* for(int i=0; i<n; i++) { printf("Monster id: %u, monster power: %u, health pack: %u, life gain: %d\n",monsters[i].monsterid,monsters[i].monsterpower,monsters[i].healthpack,monsters[i].lifegain); }*/ for(int i=0; i<n; i++) if(monsters[i].type) { if(life>monsters[i].monsterpower) { life+=monsters[i].lifegain; st1.push(monsters[i].monsterid); } else { ispossible=false; break; } } if(ispossible) for(int i=n-1; i>=0; i--) if(!monsters[i].type) { if(life>monsters[i].monsterpower) { life+=monsters[i].lifegain; st1.push(monsters[i].monsterid); } else { ispossible=false; break; } } if (ispossible) { printf("TAK\n"); while(!st1.empty()) { st2.push(st1.top()); st1.pop(); } while(!st2.empty()) { printf("%u ",st2.top()); st2.pop(); } } else { printf("NIE"); } return 0; } void quicksort(monster* tab, int s, int e) { if (s<e) { unsigned int p = divide(tab,s,e); quicksort(tab,s,p-1); quicksort(tab,p+1,e); } } unsigned int divide(monster* tab, int s, int e) { monster temp; int i,j; i=s; j=e-1; while(i<j) { while((tab[i].monsterpower<=tab[e].monsterpower)&&(i<j)) i++; while((tab[j].monsterpower>tab[e].monsterpower)&&(i<j)) j--; temp=tab[i]; tab[i]=tab[j]; tab[j]=temp; } temp=tab[j]; tab[j]=tab[e]; tab[e]=temp; return j; } |
English