典型90【079 – Two by Two(★3)】をpython解説

Python

AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画として、「典型90」があります。

今回は、その内、の79問目である「079 – Two by Two(★3)」を解説していきたいと思います。
なにか、間違っているところなどありましたら、@EitaSugiまで、ご指導ご鞭撻の程、よろしくお願い致します!

問題名 【079 – Two by Two(★3)】

問題

問題概要

H×W の2次元配列 A が与えられます。2種類の操作を行い、配列 A を配列 B に一致させることが目的です。操作は以下の通りです:

  1. 整数 x,y(1≤x<H,1≤y<W) を選び、Ax,y​,Ax+1,y​,Ax,y+1​,Ax+1,y+1​ の値をそれぞれ1ずつ増やす。
  2. 整数 x,y(1≤x<H,1≤y<W) を選び、Ax,y​,Ax+1,y​,Ax,y+1​,Ax+1,y+1​ の値をそれぞれ1ずつ減らす。

考察

影響範囲の理解

一つのセルを更新すると、そのセルを左上としたときの右上、左下、右下の3つのセルにも影響が出ます。この性質を利用して、左上から順に更新をかけることを考えます。

なぜなら、右から更新しても、左を更新する際に、また値の更新がされるためです。
しかし、左から更新すれば、左上の値は、それ以降更新されることがないです。

更新の方針

右や下から編集しても、左のセルを変更する際に影響が出てしまうため、左上から順に更新をかけることが有効です。一度操作したセルは、以降、値の変更は行われないため、効率的に操作を行うことができます。

コード

H,W = map(int, input().split())

A = []
B = []
for i in range(H):
    w = list(map(int, input().split()))
    A.append(w)

for i in range(H):
    w = list(map(int, input().split()))
    B.append(w)

cnt = 0
for i in range(H-1):
    for j in range(W-1):
        if A[i][j] == B[i][j]:
            continue
        
        elif A[i][j] > B[i][j]:
            diff = A[i][j] - B[i][j]
            for k in range(2):
                for l in range(2):
                    A[i+k][j+l] -= diff
            cnt += abs(diff)
        
        elif A[i][j] < B[i][j]:
            diff = A[i][j] - B[i][j]
            for k in range(2):
                for l in range(2):
                    A[i+k][j+l] -= diff
            cnt += abs(diff)


if A == B:
    print("Yes")
    print(cnt)
else:
    print("No")

まとめ

前の問題【076 – Cake Cut(★3)】
次の問題【】

コメント

タイトルとURLをコピーしました