結果
| 問題 | No.2840 RGB Plates |
| コンテスト | |
| ユーザー |
navel_tos
|
| 提出日時 | 2026-01-27 00:56:01 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 222 ms / 2,000 ms |
| コード長 | 1,391 bytes |
| 記録 | |
| コンパイル時間 | 354 ms |
| コンパイル使用メモリ | 82,200 KB |
| 実行使用メモリ | 65,620 KB |
| 最終ジャッジ日時 | 2026-01-27 00:56:08 |
| 合計ジャッジ時間 | 6,059 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
#yukicoder2840 RGB Plates
#入力受取 M = max(A) とする
N: int = int(input())
A: list[int] = [int(Ai) for Ai in input().split()]
M: int = max(A)
#comb(N, k)の前計算 十分に大きくなったら打ち切り
sub: list[int] = [1] * (N + 1)
INF: int = 10 ** 9
for k in range(1, - (- N >> 1) + 1):
sub[k] = sub[N - k] = sub[k - 1] * (N - k + 1) // k
if sub[k - 1] >= INF or sub[k] >= INF:
sub[k] = sub[N - k] = INF
def comb(n: int, k: int) -> int:
assert n == N
return sub[k] if 0 <= k <= n else 0
#N要素からk要素を選ぶ場合の数は comb(N, k) 通りある
#解の範囲は 0 <= w <= Mk 通りなので、Mk + 1 < comb(N, k) となるkがあれば解がMk以下と分かる
for k in range(1, N + 1):
if M * k + 1 < comb(N, k):
break
W: int = M * k
#重さW以下に絞ったナップサック問題
#DP[w]: 重さ総和がちょうどwとなるような選び方。ただし、2以上は2に丸める
DP: list[int] = [0] * (W + 1)
DP[0] = 1
for Ai in A:
for w in range(W - Ai, -1, -1):
DP[w + Ai] += DP[w]
if DP[w + Ai] > 2:
DP[w + Ai] = 2
#場合の数が2通り以上となる最小のwがあれば、G = B = w, R = sum(A) - 2w とする
ans: int = -1
for w in range(1, W + 1):
if DP[w] >= 2:
R: int = sum(A) - 2 * w
if R != 0:
ans = R
break
print(ans)
navel_tos