結果
| 問題 |
No.972 選び方のスコア
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2025-07-20 16:19:07 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 169 ms / 2,000 ms |
| コード長 | 1,319 bytes |
| コンパイル時間 | 550 ms |
| コンパイル使用メモリ | 82,648 KB |
| 実行使用メモリ | 120,880 KB |
| 最終ジャッジ日時 | 2025-07-20 16:19:14 |
| 合計ジャッジ時間 | 6,475 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
"""
https://yukicoder.me/problems/no/972
aはソートしておく
偶数個選ぶとき、中央値計算に使う2要素の右を削除すると
右半分 -> 正であり、絶対値増える
左半分 -> 負であり、絶対値が減る
消した要素の収支分、その左要素がカバーするので絶対ok
奇数のサイズのみを考えればok
中央値を a[i] と決め撃つと
a[i-k], ... , a[i-1] , a[i]
a[N-1-k], ... , a[N-1]
と選ぶのが最適
kをk-1から増やしたときの収支は
(a[i-k] - a[i]) + (a[N-1-k] - a[i])
であり、
左項はkに対して単調減少。右も単調減少。
収支が負にならないkを二分探索すればok
"""
import sys
from sys import stdin
N = int(stdin.readline())
a = list(map(int,stdin.readline().split()))
a.sort()
s = []
for i in range(N):
if i == 0:
s.append(a[i])
else:
s.append(s[-1] + a[i])
s.append(0)
ans = 0
for midx in range(N):
L = 0
R = min(midx,N-1-midx) + 1
while R-L != 1:
M = (L+R)//2
if (a[midx-M] - a[midx]) + (a[N-M]-a[midx]) > 0:
L = M
else:
R = M
sum1 = s[midx] - s[midx-L-1]
sum2 = s[N-1] - s[N-1-L]
now = sum1 + sum2 - (2*L+1)*a[midx]
# print (midx,L,sum1,sum2)
ans = max(now,ans)
print (ans)
SPD_9X2