ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC186 A - Brick / B - Blocks on Grid【Python解答例】

AtCoderパナソニックプログラミングコンテストAtCoder Beginner Contest186)に出場しました。
今回もC問題まで解くことができましたので、この記事ではAおよびB問題の解答例を書いていきます。
Panasonic Programming Contest (AtCoder Beginner Contest 186) - AtCoder

AtCoder Beginner Contest186 A - Brick

A - Brick

問題文

トラックが1台あります。このトラックには合計でNキログラム以下の荷物を載せることができます。
このトラックに、1個Wキログラムのレンガを最大でいくつ載せることができますか?

制約

・1≤N,W≤1000
・N,Wは整数である。

解答例

n, w = map(int,input().strip().split())

ans = n // w

print(ans)

解説

Nキロまで荷物を載せることができるトラックに1個Wキロのレンガがいくつ載せることができるか、という問題です。

NとWを受け取ったあとに、NをWで割った値が答えになります。
求める値は整数なので//を使って小数点以下は切り捨てにすることでACでした。

AtCoder Beginner Contest186 B - Blocks on Grid

B - Blocks on Grid

問題文

縦Hマス、横Wマスのマス目があります。上からi行目、左からj列目のマスには、ブロックがAi,j個あります。
どのマスにも同じ個数のブロックがある状態にするには、最小で何個のブロックを取り除けばよいでしょうか?

制約

・1≤H,W≤100
・0≤Ai,j≤100

解答例

h, w = map(int,input().strip().split())

a = []
for i in range(h):
    array = list(map(int, input().strip().split()))
    a.append(array)

min_brocks = 100
for i in range(h):
    for j in range(w):
        if a[i][j] < min_brocks:
            min_brocks = a[i][j]

sum_brocks = 0
for i in range(h):
    for j in range(w):
        if a[i][j] > min_brocks:
            sum_brocks += a[i][j] - min_brocks

print(sum_brocks)

解説

縦Hマス、横Wマスのマス目にそれぞれブロックが置いてあり、ブロックを取り除くことですべてのマス目にあるブロックの数を同じにするには何個ブロックを取り除いたらいいか、という問題です。

各マス目においてあるブロック数の最小値に、すべてのマス目をあわせればいいので、まずはブロックの最小値を求めました。
制約からブロックの最大値は100なので、min_brocks変数を用意して100を代入しました。
その後、2重ループで各マス目のブロック数を調べて、min_brocksより調べているマス目のブロック数が小さければ、その値を代入します。
このループを抜ければmin_brocksには最小のブロック数が格納されています。

再度、2重ループで各マス目のブロック数とmin_brocksの差をsum_brocksに足していきます(上記プログラムのif文はいらなかったですね…)。
ループを抜ければ、すべてのマス目のブロック数が等しくなるように取り除いたときのブロック数が求まります。


B問題まではある程度安定して解けるようになってきました。
すこしは成長したかなって思います。

次回の記事はC問題の解答例について書いていきたいと思います。