提出 #72815885
ソースコード 拡げる
#include <stdio.h>
#include <stdlib.h>
int cmp(const void* x, const void* y) {
int a = *(const int*)x, b = *(const int*)y;
return (a > b) - (a < b);
}
int N, M;
int P[1024];
int scores[1024 * 1024];
int main(void) {
int i, j;
int num = 0;
int ans = 0;
if (scanf("%d%d", &N, &M) != 2) return 1;
for (i = 0; i < N; i++) {
if (scanf("%d", &P[i]) != 1) return 1;
}
for (i = 0; i < N; i++) {
for (j = i; j < N; j++) {
scores[num++] = P[i] + P[j];
}
}
for (i = 0; i < N; i++) {
scores[num++] = P[i];
}
scores[num++] = 0;
qsort(scores, num, sizeof(*scores), cmp);
for (i = 0; i < num && scores[i] <= M; i++) {
int target = M - scores[i], candidate;
int le = 0, g = num;
while (le + 1 < g) {
int m = le + (g - le) / 2;
if (scores[m] <= target) le = m; else g = m;
}
candidate = scores[i] + scores[le];
if (ans < candidate) ans = candidate;
}
printf("%d\n", ans);
return 0;
}
/*
半分全列挙
*/
提出情報
ジャッジ結果
| セット名 | set01 | set02 | set03 | set04 | set05 | set06 | set07 | set08 | set09 | set10 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | 2 / 2 | ||||||||||||||||||||
| 結果 |
|
|
|
|
|
|
|
|
|
|
| セット名 | テストケース |
|---|---|
| set01 | data1 |
| set02 | data2 |
| set03 | data3 |
| set04 | data4 |
| set05 | data5 |
| set06 | data6 |
| set07 | data7 |
| set08 | data8 |
| set09 | data9 |
| set10 | data10 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| data1 | AC | 1 ms | 1696 KiB |
| data10 | AC | 72 ms | 5412 KiB |
| data2 | AC | 1 ms | 1688 KiB |
| data3 | AC | 6 ms | 2060 KiB |
| data4 | AC | 6 ms | 2060 KiB |
| data5 | AC | 5 ms | 1996 KiB |
| data6 | AC | 68 ms | 5500 KiB |
| data7 | AC | 77 ms | 5536 KiB |
| data8 | AC | 71 ms | 5532 KiB |
| data9 | AC | 72 ms | 5524 KiB |