#include <stdio.h>
#include <stdlib.h>
int poz = 0;
long long int z;
struct w {
int k; //koszt
int p; //przychod
int poz;
int next;
int prev;
};
struct w *in;
int f(const void* A, const void* B) {
//printf("A.p %d B.p %d\n", ((struct w*)A)->p, ((struct w*)B)->p);
if(((struct w*)A)->p > 0 && ((struct w*)B)->p > 0) {
//printf("1\n");
if(((struct w*)A)->p > ((struct w*)B)->p) return -1;
else if(((struct w*)A)->p < ((struct w*)B)->p) return 1;
else return 0;
} else {
//printf("2\n");
if(((struct w*)A)->p+((struct w*)A)->k > ((struct w*)B)->p+((struct w*)B)->k) return -1;
else if(((struct w*)A)->p+((struct w*)A)->k < ((struct w*)B)->p+((struct w*)B)->k) return 1;
else return 0;
}
}
void find_up() {
while(poz != 0) {
if((*(in+poz)).prev == -1) break;
if((*(in+(*(in+poz)).prev)).k >= z) break;
poz = (*(in+poz)).prev;
}
}
void find_down() {
poz = (*(in+poz)).next;
while(poz != -1) {
if((*(in+poz)).k<z) break;
poz = (*(in+poz)).next;
}
}
void update() {
int q = 0;
if((*(in+poz)).next != -1) {
(*(in+(*(in+poz)).next)).prev = (*(in+poz)).prev;
q = 1;
}
if((*(in+poz)).prev != -1) {
(*(in+(*(in+poz)).prev)).next = (*(in+poz)).next;
if(q != 1) q = 2;
}
z += (*(in+poz)).p;
//printf("z %lld\n", z);
if(q == 1)
poz = (*(in+poz)).next;
else if(q == 2)
poz = (*(in+poz)).prev;
//printf("poz %d\n", poz);
}
int main() {
int *d;
int n,i,k,p;
scanf("%d %lld\n", &n, &z);
in = (struct w*)malloc(sizeof(struct w)*n);
d = (int*)malloc(sizeof(int)*n);
i=0;
while(i<n) {
scanf("%d %d\n", &k, &p);
(*(in+i)).k = k;
(*(in+i)).p = p-k;
(*(in+i)).poz = i+1;
i++;
}
qsort(in, n, sizeof(struct w), f);
i=0;
while(i<n) {
(*(in+i)).next = i+1;
(*(in+i)).prev = i-1;
i++;
}
(*(in+n-1)).next = -1;
i = 0;
poz = 0;
while(i<n && z > 0) {
if((*(in+poz)).k >= z) {
// printf("szukam w dol\n");
find_down();
if(poz == -1) {
break;
}
} else {
// printf("szukam w gore\n");
find_up();
}
*(d+i) = (*(in+poz)).poz;
update();
i++;
}
if(i == n) {
printf("TAK\n");
i=0;
while(i<n) {
printf("%d ", *(d+i));
i++;
}
} else
printf("NIE");
/*
i = 0;
while(i<n) {
printf("%d\n", (*(in+i)).p);
i++;
}*/
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 116 117 118 119 120 | #include <stdio.h> #include <stdlib.h> int poz = 0; long long int z; struct w { int k; //koszt int p; //przychod int poz; int next; int prev; }; struct w *in; int f(const void* A, const void* B) { //printf("A.p %d B.p %d\n", ((struct w*)A)->p, ((struct w*)B)->p); if(((struct w*)A)->p > 0 && ((struct w*)B)->p > 0) { //printf("1\n"); if(((struct w*)A)->p > ((struct w*)B)->p) return -1; else if(((struct w*)A)->p < ((struct w*)B)->p) return 1; else return 0; } else { //printf("2\n"); if(((struct w*)A)->p+((struct w*)A)->k > ((struct w*)B)->p+((struct w*)B)->k) return -1; else if(((struct w*)A)->p+((struct w*)A)->k < ((struct w*)B)->p+((struct w*)B)->k) return 1; else return 0; } } void find_up() { while(poz != 0) { if((*(in+poz)).prev == -1) break; if((*(in+(*(in+poz)).prev)).k >= z) break; poz = (*(in+poz)).prev; } } void find_down() { poz = (*(in+poz)).next; while(poz != -1) { if((*(in+poz)).k<z) break; poz = (*(in+poz)).next; } } void update() { int q = 0; if((*(in+poz)).next != -1) { (*(in+(*(in+poz)).next)).prev = (*(in+poz)).prev; q = 1; } if((*(in+poz)).prev != -1) { (*(in+(*(in+poz)).prev)).next = (*(in+poz)).next; if(q != 1) q = 2; } z += (*(in+poz)).p; //printf("z %lld\n", z); if(q == 1) poz = (*(in+poz)).next; else if(q == 2) poz = (*(in+poz)).prev; //printf("poz %d\n", poz); } int main() { int *d; int n,i,k,p; scanf("%d %lld\n", &n, &z); in = (struct w*)malloc(sizeof(struct w)*n); d = (int*)malloc(sizeof(int)*n); i=0; while(i<n) { scanf("%d %d\n", &k, &p); (*(in+i)).k = k; (*(in+i)).p = p-k; (*(in+i)).poz = i+1; i++; } qsort(in, n, sizeof(struct w), f); i=0; while(i<n) { (*(in+i)).next = i+1; (*(in+i)).prev = i-1; i++; } (*(in+n-1)).next = -1; i = 0; poz = 0; while(i<n && z > 0) { if((*(in+poz)).k >= z) { // printf("szukam w dol\n"); find_down(); if(poz == -1) { break; } } else { // printf("szukam w gore\n"); find_up(); } *(d+i) = (*(in+poz)).poz; update(); i++; } if(i == n) { printf("TAK\n"); i=0; while(i<n) { printf("%d ", *(d+i)); i++; } } else printf("NIE"); /* i = 0; while(i<n) { printf("%d\n", (*(in+i)).p); i++; }*/ return 0; } |
English