aacord’s memo

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

早稲田大学プログラミングコンテスト2019 B - 10 puzzle

場合分けが無限にある。
条件がきつい順に
全部0の場合→0
5が含まれていない場合→ No
全部5以下の場合→1
min(h, w) > 1 なら
最大値 9 → 4
最大値 8 → 3
最大値 6,7 → 2
となり、
そして上記以外で、h or w = 1 のときは、5の左右の列で最大値ごとに計算する必要がある。それを全ての5で計算して最小値をだす。えぐい。

import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import itertools

h,w = map(int,readline().split())
c = [list(map(int,input().split())) for i in range(h)]
b = list(itertools.chain.from_iterable(c))
a = set(itertools.chain.from_iterable(c))

if a == {0}:
  print('Yes 0')
  exit()
  
if not 5 in a:
  print('No')
  exit()
  
if max(a) == 5:
  print('Yes 1')
  exit()
  
if w == 1 or h == 1:
  g = []
  p = 0
  m = 0
  for i in b:
    if i == 5:
      if m == 9:
        p += 3
      elif m == 8:
        p += 2
      elif m > 5:
        p += 1
      c = {0}
      g.append(p)
      p = 0
    else:
      m = max(i,m)
  if m == 9:
    p += 3
  elif m == 8:
    p += 2
  elif m > 5:
    p += 1
  g.append(p)
  k  = 100
  for i in range(len(g)-1):
    kk = max(g[:i+1])+max(g[i+1:])
    ks = min(ks,kk)
  print('Yes {}'.format(ks+1))
  exit()
  
if 9 in a:
  print('Yes 4')
  exit()
  
if 8 in a:
  print('Yes 3')
  exit()
  
print('Yes 2')