結果

問題 No.617 Nafmo、買い出しに行く
ユーザー kichirb3kichirb3
提出日時 2018-03-02 13:36:55
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 37 ms / 2,000 ms
コード長 1,415 bytes
コンパイル時間 224 ms
コンパイル使用メモリ 12,672 KB
実行使用メモリ 11,008 KB
最終ジャッジ日時 2024-06-10 21:39:12
合計ジャッジ時間 1,816 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 27 ms
10,880 KB
testcase_01 AC 27 ms
10,880 KB
testcase_02 AC 28 ms
11,008 KB
testcase_03 AC 30 ms
10,880 KB
testcase_04 AC 28 ms
10,752 KB
testcase_05 AC 32 ms
10,880 KB
testcase_06 AC 33 ms
10,880 KB
testcase_07 AC 33 ms
10,880 KB
testcase_08 AC 27 ms
10,880 KB
testcase_09 AC 27 ms
11,008 KB
testcase_10 AC 33 ms
10,880 KB
testcase_11 AC 37 ms
10,752 KB
testcase_12 AC 37 ms
10,880 KB
testcase_13 AC 35 ms
10,880 KB
testcase_14 AC 33 ms
10,880 KB
testcase_15 AC 32 ms
10,880 KB
testcase_16 AC 33 ms
10,880 KB
testcase_17 AC 33 ms
10,880 KB
testcase_18 AC 27 ms
10,880 KB
testcase_19 AC 27 ms
10,880 KB
testcase_20 AC 26 ms
11,008 KB
testcase_21 AC 27 ms
10,880 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

# -*- coding: utf-8 -*-
"""
No.617 Nafmo、買い出しに行く
https://yukicoder.me/problems/no/617

"""
import sys
from sys import stdin
from itertools import compress
from bisect import bisect_right
input = stdin.readline


def main():
    N, K = map(int, input().split())
    items = []
    for i in range(N):
        items.append(int(input()))

    # アイテムを半分に分ける (後半は空の可能性もあり)
    items_a = items[:10]
    items_b = items[10:]

    # 前半のアイテムを選択した場合の重さの組み合わせを列挙
    total_a = []
    for i in range(2**len(items_a)):
        mask = [int(x) for x in list(bin(i)[2:].zfill(len(items_a)))]
        res = compress(items_a, mask)
        total_a.append(sum(res))

    # 後半のアイテムを選択した場合の重さの組み合わせを列挙
    total_b = []
    for i in range(2**len(items_b)):
        mask = [int(x) for x in list(bin(i)[2:].zfill(len(items_b)))]
        res = compress(items_b, mask)
        total_b.append(sum(res))

    # 前半と後半の重さの組み合わせから、K以内での最大値を求める
    total_a.sort();
    total_b.sort();
    total_max = 0;
    for a in total_a:
        i = bisect_right(total_b, K-a)
        total = a + total_b[i-1]
        if total <= K:
            total_max = max(total, total_max)
    print(total_max)


if __name__ == '__main__':
    main()
0