結果
| 問題 | No.972 選び方のスコア |
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2020-01-18 09:39:06 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 1,590 ms / 2,000 ms |
| コード長 | 1,437 bytes |
| コンパイル時間 | 106 ms |
| コンパイル使用メモリ | 12,800 KB |
| 実行使用メモリ | 32,912 KB |
| 最終ジャッジ日時 | 2024-06-27 01:28:54 |
| 合計ジャッジ時間 | 36,177 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
import itertools
import sys
sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def main():
n = II()
aa = LI()
# 初期配置は答えと無関係なのでソート
aa.sort()
# 累積和を事前計算
cs = [0]
for a in aa: cs.append(cs[-1] + a)
# 中央値mをすべて(両端は除く)試す
ans = 0
for i, m in enumerate(aa[1:-1], 1):
# mの左右から何個ずつ選ぶかを二分探索で決める
# 左はmの近くから、右はmの遠くから選ぶのが最適
# k個目を選ぶことで、スコアが増加するかで判断
# つまり(左のk個目)-m+(右のk個目)-m>0となる最大のkを探す
l = 0
r = min(i, n - i - 1) + 1
while l + 1 < r:
k = (l + r) // 2
if aa[i - k] + aa[n - k] - 2 * m > 0:
l = k
else:
r = k
k = l
# このときのスコアを計算(左の和+右の和-mが2k個)
score = (cs[i] - cs[i - k]) + (cs[n] - cs[n - k]) - 2 * k * m
# 最大のスコアが答え
if score > ans: ans = score
print(ans)
main()
mkawa2