結果
| 問題 | No.3670 Fast Knapsack |
| コンテスト | |
| ユーザー |
harurun
|
| 提出日時 | 2026-09-01 22:35:32 |
| 言語 | PyPy3 (7.3.23) |
| 結果 |
AC
|
| 実行時間 | 2,287 ms / 2,500 ms |
| + 474µs | |
| コード長 | 1,807 bytes |
| 記録 | |
| コンパイル時間 | 247 ms |
| コンパイル使用メモリ | 95,956 KB |
| 実行使用メモリ | 132,608 KB |
| 最終ジャッジ日時 | 2026-09-04 23:03:52 |
| 合計ジャッジ時間 | 24,474 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge5_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 25 |
ソースコード
import sys
import pypyjit
# 短いテストケースが多数あっても、ループを早期に JIT コンパイルさせる。
pypyjit.set_param(
"threshold=1,"
"function_threshold=1,"
"trace_eagerness=1,"
"trace_limit=100000,"
"inlining=1,"
"decay=0"
)
def solve() -> None:
data = list(map(int, sys.stdin.buffer.read().split()))
pos = 0
t = data[pos]
pos += 1
answers = [""] * t
case = 0
while case < t:
n = data[pos]
s = data[pos + 1]
pos += 2
end = pos + n
# bit i == 1 <=> 部分和 i が作れる
reachable = 1
# 現在到達可能な最大値
hi = 0
mask = (1 << (s + 1)) - 1
while pos < end:
a = data[pos]
pos += 1
# Ai > S は正整数なので絶対に使用できない
if a > s:
continue
# 単独で S を作れる
if a == s:
hi = s
pos = end
break
new_hi = hi + a
if new_hi <= s:
# この場合、S より上の bit は発生しないので
# 高コストな & mask を省略できる
reachable |= reachable << a
hi = new_hi
if hi == s:
pos = end
break
else:
reachable = (reachable | (reachable << a)) & mask
hi = reachable.bit_length() - 1
# S に到達した時点で答えは確定
if hi == s:
pos = end
break
answers[case] = str(hi)
case += 1
sys.stdout.write("\n".join(answers))
if __name__ == "__main__":
solve()
harurun