AtCoder Beginner Contest

【pythonでABC186を解説】B - Blocks on Grid

問題概要

問題ページ

問題文

縦 \(H\) マス、横 \(W\) マスのマス目があります。上から \(i\) 行目、左から \(j\) 列目のマスには、ブロックが \(A_{i,j}\) 個あります。

どのマスにも同じ個数のブロックがある状態にするには、最小で何個のブロックを取り除けばよいでしょうか?

制約

  • \(1 \leq H,W \leq 100\)
  • \(0\leq A_{i,j} \leq 100\)

問題の考察

ブロックの数はを増やすことはできないが、減らすことはできることを読み取れれば簡単な問題。

ブロックの個数の最小値を求めて、全てのブロックを最小値にあわせれば良い。

for文で全てのマスを全探索して最小値を求めて、再度for文で現在のブロックの個数を最小値の個数を集計すれば良い。

たびすけ
for文とminを使って集計ができれば簡単な問題です!

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    h, w = list(map(int, input().rstrip('\n').split()))
    a = [list(map(int, input().rstrip('\n').split())) for _ in range(h)]
    mn = 10 ** 20
    for i in range(h):
        for j in range(w):
            mn = min(mn, a[i][j])
    cnt = 0
    for i in range(h):
        for j in range(w):
            cnt += a[i][j] - mn
    print(cnt)


if __name__ == '__main__':
    solve()

-AtCoder Beginner Contest
-