aacord’s memo

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

abc 100 D - Patisserie ABC (python)

解けなかった。
発想1.(Xi + Xj + Xk) + (Yi + Yj + Yk) + (Zi + Zj + Zk) を
(Xi + Yi + Zi) + (Xj + Yj + Zj) + (Xk + Yk + Zk) とみて考える。
これは添え字が同じになるように移項するのと同じ発想なので思いつくべきだった。
発想2.- (Xi + Xj + Xk) + (Yi + Yj + Yk) - (Zi + Zj + Zk)
= (- Xi + Yi - Zi) + (- Xj + Yj - Zj) + (- Xk + Yk - Zk)
確かにとはなったけど、自力では厳しい考えだった。

なので、X, Y, Z それぞれが + か - かの8通りで ± X ± Y ± Z を求めておいて、降順ソートして m 個の和を求めたうちの最大値を出せば終わり。
numpy 使うと楽に書ける。

import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import numpy as np

n,m = map(int,readline().split())
chk =  np.empty((n,8),dtype=np.int64) # n行8列の初期リスト
for i in range(n):
  a,b,c = map(int,readline().split())
  chk[i][0] = a+b+c
  chk[i][1] = a+b-c
  chk[i][2] = a-b+c
  chk[i][3] = a-b-c
  chk[i][4] = -a+b+c
  chk[i][5] = -a-b+c
  chk[i][6] = -a+b-c
  chk[i][7] = -a-b-c
  
chk = np.sort(chk,axis=0)[::-1] # 8列分一括で列ごとに降順ソート
chk = np.resize(chk,(m,8)) # 上からm個まであればいい
print(max(np.sum(chk,axis=0))) # 列ごとに合計値求めた中の最大値が答え