/* paiza POH! Lite
* result:
* http://p...content-available-to-author-only...a.jp/poh/kirishima/result/c280a18433b821b893a3b592f7bfa356
* author: Leonardone @ NEETSDKASU
*/
#include <stdio.h>
#include <stdlib.h>
/* 全通りの組み合わせから条件に符合する答えを求める */
#define SEEK(I, Q, R) \
{ \
b = 1LL << nn; \
for (;;) { \
if (a > b) { \
break; \
} \
sum_q = sum_r = 0; \
for (i = 0; i < n; i++) { \
if ((a >> i) & 1LL) { \
sum_q += data[(I)].q; \
sum_r += data[(I)].r; \
} \
} \
if (((Q) >= m) && ((R) < min)) { \
min = (R); \
} \
a++; \
} \
}
/* 1社ごとの情報 */
typedef struct _data {
int q; /* 動員人数 */
int r; /* 費用 */
double p; /* 1人あたりの人件費 */
} DATA, *PDATA;
/* 1人あたりの人件費を昇順(安い順)でソート */
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 main(void) {
int m; /* 必要な人数 */
int n; /* 会社の数 */
DATA data[50]; /* 全n社の各社の人数と費用 */
PDATA pdata;
int i;
int all_q = 0; /* 全n社の人数の合計 */
int all_r = 0; /* 全n社の費用の合計 */
int sum_q, sum_r, min, d, nn;
long long a, b;
pdata = data;
for (i = 0; i < n; i++) {
scanf("%d %d", &pdata
->q
, &pdata
->r
); pdata->p = (double)pdata->r / (double)pdata->q;
all_q += pdata->q;
all_r += pdata->r;
pdata++;
}
qsort(data
, n
, sizeof(DATA
), sort_p
);
/* 人件費の割安な会社から順に人数を合計し */
/* 合計人数が初めてm以上になる位置を求める */
sum_q = sum_r = 0;
pdata = data;
for (i = 0; i < n; i++) {
sum_q += pdata->q;
sum_r += pdata->r;
if (sum_q >= m) {
break;
}
pdata++;
}
min = 250000000;
a = 1LL;
if (n - i > i) {
/* 求めた割安な会社数が全n社の半分より少ないとき */
/* 割安な会社をさらに3社追加し */
/* 割高な会社は絶対使わないだろうと決め付け */
/* その中で全通りの組み合わせを求め 条件に符号する結果を得る */
d = i + 3;
nn = d > n ? n : d;
SEEK(i, sum_q, sum_r);
} else {
/* 求めた割安な会社数が全n社の半分より多いとき */
/* 前者とは逆に使わない割高の会社の組み合わせから結果を求める */
/* 求めた割安な会社数から5社を除いた会社を絶対使うだろうと決め付け */
/* 割高な会社で全通りの組み合わせを求め 条件に符号する結果を得る */
d = i - 5;
if (d < 0) {
d = 0;
}
nn = n - d;
SEEK(i + d, all_q - sum_q, all_r - sum_r);
}
return 0;
}
LyogcGFpemEgUE9IISBMaXRlCiAqIHJlc3VsdDoKICogaHR0cDovL3AuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEuanAvcG9oL2tpcmlzaGltYS9yZXN1bHQvYzI4MGExODQzM2I4MjFiODkzYTNiNTkyZjdiZmEzNTYKICogYXV0aG9yOiBMZW9uYXJkb25lIEAgTkVFVFNES0FTVQogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8qIOWFqOmAmuOCiuOBrue1hOOBv+WQiOOCj+OBm+OBi+OCieadoeS7tuOBq+espuWQiOOBmeOCi+etlOOBiOOCkuaxguOCgeOCiyAqLwojZGVmaW5lIFNFRUsoSSwgUSwgUikgICAgICAgICAgICAgICAgICAgICAgICAgXAoJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCWIgPSAxTEwgPDwgbm47ICAgICAgICAgICAgICAgICAgICAgICAgXAoJCWZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQlpZiAoYSA+IGIpIHsgICAgICAgICAgICAgICAgICAgICAgXAoJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQlzdW1fcSA9IHN1bV9yID0gMDsgICAgICAgICAgICAgICAgXAoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7ICAgICAgICAgXAoJCQkJaWYgKChhID4+IGkpICYgMUxMKSB7ICAgICAgICAgXAoJCQkJCXN1bV9xICs9IGRhdGFbKEkpXS5xOyAgICAgXAoJCQkJCXN1bV9yICs9IGRhdGFbKEkpXS5yOyAgICAgXAoJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQlpZiAoKChRKSA+PSBtKSAmJiAoKFIpIDwgbWluKSkgeyAgXAoJCQkJbWluID0gKFIpOyAgICAgICAgICAgICAgICAgICAgXAoJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCQlhKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoJfQoKCi8qIDHnpL7jgZTjgajjga7mg4XloLEgKi8KdHlwZWRlZiBzdHJ1Y3QgX2RhdGEgewoJaW50IHE7IC8qIOWLleWToeS6uuaVsCAqLwoJaW50IHI7IC8qIOiyu+eUqCAqLwoJZG91YmxlIHA7IC8qIDHkurrjgYLjgZ/jgorjga7kurrku7bosrsgKi8KfSBEQVRBLCAqUERBVEE7CgovKiAx5Lq644GC44Gf44KK44Gu5Lq65Lu26LK744KS5piH6aCGKOWuieOBhOmghinjgafjgr3jg7zjg4ggKi8KaW50IHNvcnRfcCh2b2lkICphLCB2b2lkICpiKSB7CglQREFUQSBwYSA9IChQREFUQSlhOwoJUERBVEEgcGIgPSAoUERBVEEpYjsKCWRvdWJsZSBkID0gcGEtPnAgLSBwYi0+cDsKCWlmIChkID4gMCkgewoJCXJldHVybiAxOwoJfSBlbHNlIGlmIChkIDwgMCkgewoJCXJldHVybiAtMTsKCX0gZWxzZSB7CgkJcmV0dXJuIDA7Cgl9Cn0KCmludCBtYWluKHZvaWQpIHsKCQoJaW50IG07IC8qIOW/heimgeOBquS6uuaVsCAqLwoJaW50IG47IC8qIOS8muekvuOBruaVsCAqLwoJREFUQSBkYXRhWzUwXTsgLyog5YWobuekvuOBruWQhOekvuOBruS6uuaVsOOBqOiyu+eUqCAqLwoJCglQREFUQSBwZGF0YTsKCWludCBpOwoKCWludCBhbGxfcSA9IDA7IC8qIOWFqG7npL7jga7kurrmlbDjga7lkIjoqIggKi8KCWludCBhbGxfciA9IDA7IC8qIOWFqG7npL7jga7osrvnlKjjga7lkIjoqIggKi8KCglpbnQgc3VtX3EsIHN1bV9yLCBtaW4sIGQsIG5uOwoJbG9uZyBsb25nIGEsIGI7CgkKCXNjYW5mKCIlZCIsICZtKTsKCXNjYW5mKCIlZCIsICZuKTsKCQoJcGRhdGEgPSBkYXRhOwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewoJCXNjYW5mKCIlZCAlZCIsICZwZGF0YS0+cSwgJnBkYXRhLT5yKTsKCQlwZGF0YS0+cCA9IChkb3VibGUpcGRhdGEtPnIgLyAoZG91YmxlKXBkYXRhLT5xOwoJCWFsbF9xICs9IHBkYXRhLT5xOwoJCWFsbF9yICs9IHBkYXRhLT5yOwoJCXBkYXRhKys7Cgl9CgkKCXFzb3J0KGRhdGEsIG4sIHNpemVvZihEQVRBKSwgc29ydF9wKTsKCQoJLyog5Lq65Lu26LK744Gu5Ymy5a6J44Gq5Lya56S+44GL44KJ6aCG44Gr5Lq65pWw44KS5ZCI6KiI44GXICovCgkvKiDlkIjoqIjkurrmlbDjgYzliJ3jgoHjgaZt5Lul5LiK44Gr44Gq44KL5L2N572u44KS5rGC44KB44KLICovCglzdW1fcSA9IHN1bV9yID0gMDsKCXBkYXRhID0gZGF0YTsKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKCQlzdW1fcSArPSBwZGF0YS0+cTsKCQlzdW1fciArPSBwZGF0YS0+cjsKCQlpZiAoc3VtX3EgPj0gbSkgewoJCQlicmVhazsKCQl9CgkJcGRhdGErKzsKCX0KCQoJbWluID0gMjUwMDAwMDAwOwoJYSA9IDFMTDsKCQoJaWYgKG4gLSBpID4gaSkgewoJCS8qIOaxguOCgeOBn+WJsuWuieOBquS8muekvuaVsOOBjOWFqG7npL7jga7ljYrliIbjgojjgorlsJHjgarjgYTjgajjgY0gKi8KCQkvKiDlibLlronjgarkvJrnpL7jgpLjgZXjgonjgasz56S+6L+95Yqg44GXICovCgkJLyog5Ymy6auY44Gq5Lya56S+44Gv57W25a++5L2/44KP44Gq44GE44Gg44KN44GG44Go5rG644KB5LuY44GRICovCgkJLyog44Gd44Gu5Lit44Gn5YWo6YCa44KK44Gu57WE44G/5ZCI44KP44Gb44KS5rGC44KBIOadoeS7tuOBq+espuWPt+OBmeOCi+e1kOaenOOCkuW+l+OCiyAqLwoJCWQgPSBpICsgMzsKCQlubiA9IGQgPiBuID8gbiA6IGQ7CgkJU0VFSyhpLCBzdW1fcSwgc3VtX3IpOwoJfSBlbHNlIHsKCQkvKiDmsYLjgoHjgZ/libLlronjgarkvJrnpL7mlbDjgYzlhahu56S+44Gu5Y2K5YiG44KI44KK5aSa44GE44Go44GNICovCgkJLyog5YmN6ICF44Go44Gv6YCG44Gr5L2/44KP44Gq44GE5Ymy6auY44Gu5Lya56S+44Gu57WE44G/5ZCI44KP44Gb44GL44KJ57WQ5p6c44KS5rGC44KB44KLICovCgkJLyog5rGC44KB44Gf5Ymy5a6J44Gq5Lya56S+5pWw44GL44KJNeekvuOCkumZpOOBhOOBn+S8muekvuOCkue1tuWvvuS9v+OBhuOBoOOCjeOBhuOBqOaxuuOCgeS7mOOBkSAqLwoJCS8qIOWJsumrmOOBquS8muekvuOBp+WFqOmAmuOCiuOBrue1hOOBv+WQiOOCj+OBm+OCkuaxguOCgSDmnaHku7bjgavnrKblj7fjgZnjgovntZDmnpzjgpLlvpfjgosgKi8KCQlkID0gaSAtIDU7CgkJaWYgKGQgPCAwKSB7CgkJCWQgPSAwOwoJCX0KCQlubiA9IG4gLSBkOwoJCVNFRUsoaSArIGQsIGFsbF9xIC0gc3VtX3EsIGFsbF9yIC0gc3VtX3IpOwoJfQoKCXByaW50ZigiJWRcbiIsIG1pbik7CgoJcmV0dXJuIDA7Cn0K