/* paiza POH! Lite
* result:
* http://p...content-available-to-author-only...a.jp/poh/kirishima/result/fcb6a30d5dfc8e0fd781c5ed4efc1b6a
* author: Leonardone @ NEETSDKASU
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct _data {
int q;
int r;
double p;
int f;
} DATA, *PDATA;
int sort_p(void *a, void *b) {
PDATA pa = (PDATA)a;
PDATA pb = (PDATA)b;
double d = pa->p - pb->p;
if (d > 0) {
return 1;
} else if (d < 0) {
return -1;
} else {
return 0;
}
}
int sort_q(void *a, void *b) {
PDATA pa = (PDATA)a;
PDATA pb = (PDATA)b;
return pb->q - pa->q;
}
int all_q, all_r;
DATA data[100];
void foo(int m, int n) {
int a0, a1, b0, b1, c0;
int min, sum_q, sum_r;
int i;
if (n > 25) {
b0 = 0;
b1 = 1 << (n - 25);
} else {
b0 = 1 << n;
b1 = 0;
}
a0 = 1;
a1 = 0;
c0 = 1 << 25;
min = 250000000;
for (;;) {
if (a1 > b1) {
break;
} else if (a1 == b1 && a0 > b0) {
break;
}
if (a0 == c0) {
a0 = 0;
a1++;
}
sum_q = sum_r = 0;
for (i = 0; i < 25; i++) {
if ((a0 >> i) & 1) {
sum_q += data[i].q;
sum_r += data[i].r;
}
if ((a1 >> i) & 1) {
sum_q += data[i + 25].q;
sum_r += data[i + 25].r;
}
}
if (sum_q >= m && sum_r < min) {
min = sum_r;
}
a0++;
}
}
void bar(int m, int n, int d) {
int a0, a1, b0, b1, c0;
int min, sum_q, sum_r;
int i;
if (n > 25) {
b0 = 0;
b1 = 1 << (n - 25);
} else {
b0 = 1 << n;
b1 = 0;
}
a0 = 1;
a1 = 0;
c0 = 1 << 25;
min = 250000000;
for (;;) {
if (a1 > b1) {
break;
} else if (a1 == b1 && a0 > b0) {
break;
}
if (a0 == c0) {
a0 = 0;
a1++;
}
sum_q = sum_r = 0;
for (i = 0; i < 25; i++) {
if ((a0 >> i) & 1) {
sum_q += data[i + d].q;
sum_r += data[i + d].r;
}
if ((a1 >> i) & 1) {
sum_q += data[i + d + 25].q;
sum_r += data[i + d + 25].r;
}
}
if (all_q - sum_q >= m && all_r - sum_r < min) {
min = all_r - sum_r;
}
a0++;
}
}
int main(void) {
int m, n;
PDATA pdata = data;
int i, j, k;
int sum_q, sum_r;
for (i = 0; i < n; i++) {
scanf("%d %d", &pdata
->q
, &pdata
->r
); all_q += pdata->q;
all_r += pdata->r;
pdata->p = (double)pdata->r / (double)pdata->q;
pdata++;
}
qsort(data
, n
, sizeof(DATA
), sort_p
);
sum_q = sum_r = 0;
pdata = data;
for (i = 0; i < n; i++) {
sum_q += pdata->q;
sum_r += pdata->r;
pdata->f = 1;
if (sum_q >= m) {
break;
}
pdata++;
}
if (n - i > i) {
i += 3;
foo(m, i > n ? n : i);
} else {
i -= 5;
if (i < 0) {
i = 0;
}
bar(m, n - i, i);
}
return 0;
}
LyogcGFpemEgUE9IISBMaXRlCiAqIHJlc3VsdDoKICogaHR0cDovL3AuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEuanAvcG9oL2tpcmlzaGltYS9yZXN1bHQvZmNiNmEzMGQ1ZGZjOGUwZmQ3ODFjNWVkNGVmYzFiNmEKICogYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IF9kYXRhIHsKCWludCBxOwoJaW50IHI7Cglkb3VibGUgcDsKCWludCBmOwp9IERBVEEsICpQREFUQTsKCmludCBzb3J0X3Aodm9pZCAqYSwgdm9pZCAqYikgewoJUERBVEEgcGEgPSAoUERBVEEpYTsKCVBEQVRBIHBiID0gKFBEQVRBKWI7Cglkb3VibGUgZCA9IHBhLT5wIC0gcGItPnA7CglpZiAoZCA+IDApIHsKCQlyZXR1cm4gMTsKCX0gZWxzZSBpZiAoZCA8IDApIHsKCQlyZXR1cm4gLTE7Cgl9IGVsc2UgewoJCXJldHVybiAwOwoJfQp9CgppbnQgc29ydF9xKHZvaWQgKmEsIHZvaWQgKmIpIHsKCVBEQVRBIHBhID0gKFBEQVRBKWE7CglQREFUQSBwYiA9IChQREFUQSliOwoJcmV0dXJuIHBiLT5xIC0gcGEtPnE7Cn0KCmludCBhbGxfcSwgYWxsX3I7CkRBVEEgZGF0YVsxMDBdOwoKdm9pZCBmb28oaW50IG0sIGludCBuKSB7CglpbnQgYTAsIGExLCBiMCwgYjEsIGMwOwoJaW50IG1pbiwgc3VtX3EsIHN1bV9yOwoJaW50IGk7CgogCWlmIChuID4gMjUpIHsKCQliMCA9IDA7CgkJYjEgPSAxIDw8IChuIC0gMjUpOwoJfSBlbHNlIHsKCQliMCA9IDEgPDwgbjsKCQliMSA9IDA7Cgl9CiAKCWEwID0gMTsKCWExID0gMDsKCWMwID0gMSA8PCAyNTsKCW1pbiA9IDI1MDAwMDAwMDsKCWZvciAoOzspIHsKCQlpZiAoYTEgPiBiMSkgewoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGExID09IGIxICYmIGEwID4gYjApIHsKCQkJYnJlYWs7CgkJfQoJCWlmIChhMCA9PSBjMCkgewoJCQlhMCA9IDA7CgkJCWExKys7CgkJfQoJCXN1bV9xID0gc3VtX3IgPSAwOwoJCWZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CgkJCWlmICgoYTAgPj4gaSkgJiAxKSB7CgkJCQlzdW1fcSArPSBkYXRhW2ldLnE7CgkJCQlzdW1fciArPSBkYXRhW2ldLnI7CgkJCQl9CgkJCWlmICgoYTEgPj4gaSkgJiAxKSB7CgkJCQlzdW1fcSArPSBkYXRhW2kgKyAyNV0ucTsKCQkJCXN1bV9yICs9IGRhdGFbaSArIDI1XS5yOwoJCQl9CgkJfQoJCWlmIChzdW1fcSA+PSBtICYmIHN1bV9yIDwgbWluKSB7CgkJCW1pbiA9IHN1bV9yOwoJCX0KCQlhMCsrOwoJfQoJcHJpbnRmKCIlZFxuIiwgbWluKTsKfQoKdm9pZCBiYXIoaW50IG0sIGludCBuLCBpbnQgZCkgewoJaW50IGEwLCBhMSwgYjAsIGIxLCBjMDsKCWludCBtaW4sIHN1bV9xLCBzdW1fcjsKCWludCBpOwoKIAlpZiAobiA+IDI1KSB7CgkJYjAgPSAwOwoJCWIxID0gMSA8PCAobiAtIDI1KTsKCX0gZWxzZSB7CgkJYjAgPSAxIDw8IG47CgkJYjEgPSAwOwoJfQogCglhMCA9IDE7CglhMSA9IDA7CgljMCA9IDEgPDwgMjU7CgltaW4gPSAyNTAwMDAwMDA7Cglmb3IgKDs7KSB7CgkJaWYgKGExID4gYjEpIHsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChhMSA9PSBiMSAmJiBhMCA+IGIwKSB7CgkJCWJyZWFrOwoJCX0KCQlpZiAoYTAgPT0gYzApIHsKCQkJYTAgPSAwOwoJCQlhMSsrOwoJCX0KCQlzdW1fcSA9IHN1bV9yID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykgewoJCQlpZiAoKGEwID4+IGkpICYgMSkgewoJCQkJc3VtX3EgKz0gZGF0YVtpICsgZF0ucTsKCQkJCXN1bV9yICs9IGRhdGFbaSArIGRdLnI7CgkJCQl9CgkJCWlmICgoYTEgPj4gaSkgJiAxKSB7CgkJCQlzdW1fcSArPSBkYXRhW2kgKyBkICsgMjVdLnE7CgkJCQlzdW1fciArPSBkYXRhW2kgKyBkICsgMjVdLnI7CgkJCX0KCQl9CgkJaWYgKGFsbF9xIC0gc3VtX3EgPj0gbSAmJiBhbGxfciAtIHN1bV9yIDwgbWluKSB7CgkJCW1pbiA9IGFsbF9yIC0gc3VtX3I7CgkJfQoJCWEwKys7Cgl9CglwcmludGYoIiVkXG4iLCBtaW4pOwp9CgoKaW50IG1haW4odm9pZCkgewoJCglpbnQgbSwgbjsKCVBEQVRBIHBkYXRhID0gZGF0YTsKCWludCBpLCBqLCBrOwoJaW50IHN1bV9xLCBzdW1fcjsKCQoJc2NhbmYoIiVkIiwgJm0pOwoJc2NhbmYoIiVkIiwgJm4pOwoJCglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJc2NhbmYoIiVkICVkIiwgJnBkYXRhLT5xLCAmcGRhdGEtPnIpOwoJCWFsbF9xICs9IHBkYXRhLT5xOwoJCWFsbF9yICs9IHBkYXRhLT5yOwoJCXBkYXRhLT5wID0gKGRvdWJsZSlwZGF0YS0+ciAvIChkb3VibGUpcGRhdGEtPnE7CgkJcGRhdGErKzsKCX0KCQoJcXNvcnQoZGF0YSwgbiwgc2l6ZW9mKERBVEEpLCBzb3J0X3ApOwoJCglzdW1fcSA9IHN1bV9yID0gMDsKCXBkYXRhID0gZGF0YTsKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlzdW1fcSArPSBwZGF0YS0+cTsKCQlzdW1fciArPSBwZGF0YS0+cjsKCQlwZGF0YS0+ZiA9IDE7CgkJaWYgKHN1bV9xID49IG0pIHsKCQkJYnJlYWs7CgkJfQoJCXBkYXRhKys7Cgl9CgkKCWlmIChuIC0gaSA+IGkpIHsKCQlpICs9IDM7CgkJZm9vKG0sIGkgPiBuID8gbiA6IGkpOwoJfSBlbHNlIHsKCQlpIC09IDU7CgkJaWYgKGkgPCAwKSB7CgkJCWkgPSAwOwoJCX0KCQliYXIobSwgbiAtIGksIGkpOwkKCX0KCQoJcmV0dXJuIDA7Cn0K