LoginSignup
1
0

More than 1 year has passed since last update.

ABC214 A~C問題 ものすごく丁寧でわかりやすい解説 python 灰色~茶色コーダー向け

Last updated at Posted at 2021-08-15

ABC214(AtCoder Beginner Contest 214) A~C問題の解説記事です。
灰色~茶色コーダーの方向けに解説しています。

その他のABC解説、動画などは以下

A - New Generation ABC

入力を受け取り、何回目に当たるかをif文で判定して出力します。
入力の受け取り、出力がわからない方は以下の記事を参考にしてください。

# 入力の受け取り
N=int(input())

# 1~125回目ならば
if N<=125:
    print(4)
# 126~2111回目ならば
elif 126<=N<=211:
    print(6)
# 212~214回目ならば
else:
    print(8)

B - How many?

まずa,b,cがそれぞれ最大でいくらになるか?を考えます。
a+b+c<=Sという条件がついていて、0<=S<=100であるからa,b,cはそれぞれ最大でも100であるということがわかります。
つまり
a=0~100
b=0~100
c=0~100
について、条件を満たすか全部探索すればOKです。
計算回数は100通り×100通り×100通り=1000000=10^6くらいになります。pythonでは10^6くらいなら制約時間:2秒以内に終わらせられます。

# 入力の受け取り
S,T=map(int, input().split())

# 答えのカウント
ans=0

# a=0~100まで探索
for a in range(101):
    # b=0~100まで探索
    for b in range(101):
        # c=0~100まで探索
        for c in range(101):
            # 条件を満たしていれば
            if a+b+c<=S and a*b*c<=T:
                # 答えのカウントを1増やす
                ans+=1

# 答えの出力
print(ans)

C - Distribution

それぞれのすぬけ君について、高橋くんに宝石をもらうのが早いか?左隣のすぬけ君から宝石をもらうのが早いか?を考えます。

自分の左隣のすぬけ君が宝石をもった時刻がわかれば左隣のすぬけ君からいつ宝石をもらえるかはわかります。
これを1番目のすぬけ君~N番目のすぬけ君まで順に計算していけばよいです。

コードにするとこんなのになります。

for i in range(N):
    # 次のすぬけ君の番号。i=N-1のとき、次のすぬけ君の番号=Nではなく=0とするため%Nとする。
    next=(i+1)%N
    # 高橋君からもらうのが早いか、左隣のすぬけ君からもらうのが早いか
    T[next]=min(T[next], T[i] + S[i])

ところがすぬけ君は円形のため、1周だけでは最後の方にめっちゃ早く宝石をもらったすぬけ君がいた場合に破綻します。
具体的にはたとえば以下のようなケースでWAとなります。
「入力例」
4
1 1 1 1
100 10 20 1

このケースだと4番目のすぬけ君が時刻1で宝石をもらった後これが時刻1毎に隣のすぬけくんへ回っていきます。
ところが1周だけでは4番目のすぬけ君から1番目のすぬけ君へ宝石が回った時点で終了してしまいます。

というわけでもう一週同じ処理を行えばよいです。
もう1週することで最後の方にめっちゃ早く宝石をもらったすぬけ君がいた場合でもその宝石が前の方のすぬけ君へも回ります。

# 入力の受け取り
N=int(input())
S=list(map(int, input().split()))
T=list(map(int, input().split()))

# 1週目
for i in range(N):
    # 次のすぬけ君の番号。i=N-1のとき、次のすぬけ君の番号=Nではなく=0とするため%Nとする。
    next=(i+1)%N
    # 高橋君からもらうのが早いか、左隣のすぬけ君からもらうのが早いか
    T[next]=min(T[next], T[i] + S[i])

# 2周目
for i in range(N):
    # 次のすぬけ君の番号。i=N-1のとき、次のすぬけ君の番号=Nではなく=0とするため%Nとする。
    next=(i+1)%N
    # 高橋君からもらうのが早いか、左隣のすぬけ君からもらうのが早いか
    T[next]=min(T[next], T[i] + S[i])

# 答えの出力
for ans in T:
  print(ans)

【広告】

『AtCoder 凡人が『緑』になるための精選50問詳細解説』

AtCoderで緑になるための典型50問をひくほど丁寧に解説した本(kindle)、pdf(booth)を販売しています。
値段:100円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

1~24問目まではサンプルとして無料公開しています

『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』

ABC201~225、ARC119~128灰・茶・緑DIfficulty問題(Dif:0~1199) を解説しています。
とにかく 細かく、丁寧に、具体例を豊富に、実装をわかりやすく、コードにコメントをたくさん入れて 解説しています。

サンプルを5問分公開しています

Qiitaにて無料公開している『ものすごく丁寧でわかりやすい解説』シリーズをベースにしていますが、 【キーワード】【どう考える?】【別解】を追加 し、 【解説】と【実装のコツ】を分ける ことでよりわかりやすく、 具体例や図もより豊富に 書き直しました。
Qiitaには公開していない ARC119~128の灰・茶・緑DIfficulty問題も書き下ろし ています。

値段:300円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

ARC119~128の部分のみ抜粋した廉価版 もあります。
値段:200円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

『Excelでリバーシを作ろう!! マクロ、VBAを1から学ぶ』

Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です!
マクロ、VBAが全くわからない人でも大丈夫! 丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます!
値段:300円(Kindle Unlimited対象)

サンプルとして「準備」~「三目並べ」を無料公開しています。

【kindle】

【booth(pdf】

1
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
1
0