aacord’s memo

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

JOI 2007 予選 E おせんべい (python)

R <= 10 なので bit全探索するやつ
XOR操作が出てくるので i を2進数表示したときの n 桁目を (i>>n)&1 であらわす。
全探索は行ごとでするのに、総和は列ごとに数えるのが面倒くさい。
numpy を使って転置するか、A.sum(axis=0) で列ごとに和を取っていくとよい。
np.count_nonzero(A,axis=0) を使いたかったが、python3.4.3だと count_nonzero に axis が導入されてなかった。

import numpy as np
R,C = map(int,input().split())
S = np.array([list(map(int,input().split()))for _ in range(R)])
A = 0
for i in range(2**R):
  chk = 0
  B = S.copy()
  for j,sj in enumerate(S):
    num = (i>>j)&1
    B[j] = sj^num
    
  cnt = B.sum(axis=0)
  chk = np.maximum(cnt,R-cnt).sum()
  A = max(A,chk)
print(A)