結果
問題 |
No.972 選び方のスコア
|
ユーザー |
👑 ![]() |
提出日時 | 2025-07-20 16:17:49 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,316 bytes |
コンパイル時間 | 458 ms |
コンパイル使用メモリ | 82,228 KB |
実行使用メモリ | 120,724 KB |
最終ジャッジ日時 | 2025-07-20 16:17:58 |
合計ジャッジ時間 | 7,172 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 WA * 7 |
ソースコード
""" 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[i-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)