ABC186参戦記

企業コンですが、ABCのナンバリングがついています!

パナソニックさんありがとうございます!

家電は、いろいろと健闘した結果、購入する製品がパナソニックであることが多いですね。
LetsNoteもパナソニックですしね。今この記事を書いているのも、仕事で使用しているのもLetsNoteです!

今回のABC186について、茶色下位の私が、私が理解した内容で記載していきます。

使用言語はPython3です。

アナコンダを使用しているため、3.8ではありません。

A – Brick

標準入出力と、割り算の商を求める問題。

Python3では、// にすることで商が求まります。これを標準出力すればOKです。

# AtCoder Beginner Contest 186
# A - Brick

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

print(N//W)

少し前に知ったのですが、このほか、divmod(N,W) というので、タプル型でN÷Wの商と余りが得られるので、これらを変数で受け取って商の部分を標準出力するのでもOKです。

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

d,m=divmod(N,W)

print(d)

二次元配列の操作と、基準となる値の更新、二重のfor文を扱えるかを問われる問題。

全体の中での最小値が基準となる値です。
その最小値に他の値を合わせに行く。というプログラムを書いていきます。

まずは、入力を受け取ります。この際、二次元配列で受け取るのが管理しやすいと思います。

各配列を受け取った際にその配列の中の最小値を確認し、今まで受け取った配列の最小値よりも小さければ最小値の更新をしておきます。

入力をすべて受け取った後に、各値と最小値の差分を答えようの変数に加えていけばOKです。

# AtCoder Beginner Contest 186
# B - Blocks on Grid

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

minValue=150

AREA=[]
for i in range (H):
    w=list(map(int,input().split()))
    minOfThisW=min(w)
    minValue=min(minValue,minOfThisW)
    AREA.append(w)

ans=0
for i in range (H):
    for j in range (W):
        ans+=AREA[i][j]-minValue

print(ans)

C – Unlucky 7

8進数への返還と、特定の文字列(数字)に特定の文字(数字)が含まれているかの確認ができるか否かの確認の問題。

まず、文字列に特定の文字が存在するかどうかを判定するのはPython3では、以下のように判定できます。

print("a" in "acorn") # -->True
print("b" in "acorn") # -->False

これを10進数はそのまま数字を文字列に変換して判定。8進数は8進数に変換してから文字列にして判定しながら全探索すればOKです。

8進数での表記はPython3ではoct(Number) で実現できます。

print(oct(9)) #--> 0o11

先頭に0oと不要な文字列が含まれていますが、”7″という文字も出てこないので気にしないでOKです。

私は各数字の判定にかかる計算量が多くなって無理なのではないかと思って提出できなかったのですが、各桁の計算にo(1)かかるとして、Nが10**5以下ということで10進数8進数どちらも調べても最大10回程度なので、実行時間は十分間に合います。

(ちなみに10**6でもコードテストで間に合いました。)

NGな条件をNから引いていった数が答えになります。

# AtCoder Beginner Contest 186
# C - Unlucky 7

N=int(input())
ans=N
for i in range (N+1):
    if ("7" in str(i)) or ("7" in str(oct(i))):
        ans-=1

print(ans)

私は今回のC問題まで解けましたが、B問題で二重のfor文でなぜかH[i]W[j]とせずに、H[H]W[W]としていたせいで答えが合わなかったり、C問題で、計算量が多くなってTLEしそうだな。と迷っていたりして、無駄な時間を過ごしたせいでレーティングが下がりました。

コメント

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