結果
| 問題 | No.3697 実力を揃える |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-10 00:47:41 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,145 bytes |
| 記録 | |
| コンパイル時間 | 76 ms |
| コンパイル使用メモリ | 80,896 KB |
| 実行使用メモリ | 254,644 KB |
| 最終ジャッジ日時 | 2026-09-10 00:48:13 |
| 合計ジャッジ時間 | 10,997 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 WA * 1 |
ソースコード
# 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_array = set()
for bit in range(2 ** N2):
ans = 0
for i in range(N2):
if bit & (1 << i) > 0:
ans += A[i + N1]
bit_value_array.add(ans)
bit_value_array = list(bit_value_array)
bit_value_array.sort()
answer = float("inf")
for bit in range(2 ** N1):
a1 = bit_map[bit]
# 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()