結果
| 問題 | No.3697 実力を揃える |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-10 00:54:06 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,569 ms / 5,000 ms |
| + 100µs | |
| コード長 | 2,490 bytes |
| 記録 | |
| コンパイル時間 | 1,877 ms |
| コンパイル使用メモリ | 80,512 KB |
| 実行使用メモリ | 252,044 KB |
| 最終ジャッジ日時 | 2026-09-10 00:54:21 |
| 合計ジャッジ時間 | 13,768 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 14 |
ソースコード
# https://yukicoder.me/problems/no/3697
def main():
N = int(input())
A = list(map(int ,input().split()))
sum_a = sum(A)
# 半分全列挙
N1 = N // 2
bit_map = [0] * (2 ** N1)
for bit in range(2 ** N1):
ans = 0
for i in range(N1):
if bit & (1 << i) > 0:
ans += A[i]
bit_map[bit] = ans
N2 = N // 2
bit_value_arrays = [set() for _ in range(N2 + 1)]
for bit in range(2 ** N2):
ans = 0
bit_count = 0
for i in range(N2):
if bit & (1 << i) > 0:
bit_count += 1
ans += A[i + N1]
bit_value_arrays[bit_count].add(ans)
for x in range(N2 + 1):
bit_value_arrays[x] = list(bit_value_arrays[x])
bit_value_arrays[x].sort()
answer = float("inf")
for bit in range(2 ** N1):
a1 = bit_map[bit]
bit_count = 0
for i in range(N1):
if bit & (1 << i) > 0:
bit_count += 1
b_count = N // 2 - bit_count
bit_value_array = bit_value_arrays[b_count]
# sum_a >= 2 * aのケース
if 2 * (bit_value_array[0] + a1) <= sum_a:
low = 0
high = len(bit_value_array) - 1
border = sum_a // 2 - a1
while high - low > 1:
mid = (high + low) // 2
if bit_value_array[mid] <= border:
low = mid
else:
high = mid
if bit_value_array[high ] <= border:
x = bit_value_array[high]
else:
x = bit_value_array[low]
a = a1 + x
ans = sum_a - 2 * a
answer = min(answer, ans)
# sum_a <= 2 * aのケース
if 2 * (bit_value_array[-1] + a1) >= sum_a:
low = 0
high = len(bit_value_array) - 1
border = (sum_a + 1) // 2 - a1
while high - low > 1:
mid = (high + low) // 2
if bit_value_array[mid] >= border:
high = mid
else:
low = mid
if bit_value_array[low] >= border:
x = bit_value_array[low]
else:
x = bit_value_array[high]
a = a1 + x
ans = 2 * a - sum_a
answer = min(answer ,ans)
print(answer)
if __name__ == "__main__":
main()