aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

Tenka1 Programmer Beginner Contest C - Align (python)

C - Align

数列を並び替えて隣り合う2数の差の最大値を求める問題。
直観的に一番小さいものと一番大きいものが隣り合うように、出来るだけ真ん中に置くように並べるのがいいと予想できるが、単にそれを実装するのではなく、
隣り合う2数の差 = 大きいもので一回足す、小さいもので一回引く
と言い換えて結局大きいものから合計何回足すのか、小さいものから何回引くのか考えると簡単になる。数列の端以外は2回足したり、引いたりできるので、あとは偶奇で場合分けして端になるものの分だけ調節する。

import sys
input = sys.stdin.readline
n = int(input())
chk = []
for i in range(n):
  a = int(input())
  chk.append(a)
chk.sort()
if n%2 == 0:
  l = [i*2 for i in chk[:n//2]]
  r = [i*2 for i in chk[n//2:]]
  print(sum(r)-sum(l)+chk[n//2-1]-chk[n//2])
else:
  l = [i*2 for i in chk[:(n-1)//2]]
  r = [i*2 for i in chk[(n-1)//2+1:]]
  p = sum(r)-sum(l)+chk[(n-1)//2-1]-chk[(n-1)//2]
  q = sum(r)-sum(l)+chk[(n-1)//2]-chk[(n-1)//2+1]
  print(max(p,q))