0
0

paizaラーニング問題集「ドーナツ」を解いてみた

Posted at

▼感想:

生地に含まれるチョコの数の累積和から、
生地の穴に含まれるチョコの数の累積和を減算しました。
累積和の計算方法のやりかたを踏まえて、本問を解くことができました。

▼コード:

########## 処理0(準備) インプット,リスト定義など ###########

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

# sumC: チョコの数の累積和格納用リスト
C = [[0 for j in range(W)] for i in range(H)]
sumC = C

########## 処理1 チョコの数の累積和格納 ##########

for i in range(H):

    C[i] = list(map(int,input().split()))
    sumC[i][0] = C[i][0]
    for j in range(1,W):
        sumC[i][j] = sumC[i][j-1] + C[i][j]

########## 処理2 生地に含まれるチョコの数算出 ##########

for _ in range(N):

    y,x,B,S = map(int,input().split())

    # 生地の中心座標
    yc = y - 1
    xc = x - 1

    # 生地の穴の開始位置
    y_hs = yc - S//2
    x_hs = xc - S//2

    # 生地の開始位置
    y_s = yc - B//2
    x_s = xc - B//2

    # ctotal_tmp: 生地y_i行目に存在するチョコの数格納用変数
    # ctotal: 生地に存在するチョコの数格納用変数
    ctotal = 0
    ctotal_tmp = 0

    for i in range(y_s,y_s+B):

        # y_i行目に生地の穴が存在しない
        if y_hs > i or i > y_hs+S-1:
            if x_s == 0:
                ctotal_tmp = sumC[i][x_s+B-1]
            else:
                ctotal_tmp = (sumC[i][x_s+B-1] - sumC[i][x_s-1])

        # y_i行目に生地の穴が存在する
        else:

            #anasum: 生地の穴の部分に存在するチョコの数格納用変数
            anasum = sumC[i][x_hs+S-1] - sumC[i][x_hs-1]
            
            if x_s == 0:
                ctotal_tmp = sumC[i][x_s+B-1] - anasum
            else:
                ctotal_tmp = (sumC[i][x_s+B-1] - sumC[i][x_s-1]) - anasum
    
    ctotal += ctotal_tmp
            
print(ctotal)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0