見出し画像

[ABC274 Python]キーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274) A~C問題Python解説

ABC274の解説記事です。
ミス等ありましたらコメントにてお願いいたします。

A問題

from decimal import Decimal, ROUND_HALF_UP

A, B = map(int, input().split())

ans = Decimal(str(B/A)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)
print(ans)

Pythonで四捨五入するときによくroundを使う方がいますが、
roundでの四捨五入は正確な値を導き出せません。
代わりに、decimalを使います。
詳しくは以下をご覧ください。

問題文にはいろいろと書かれていますが、
求める答えはB/Aを小数点第4位で四捨五入したものになりますので、
decimalを使って四捨五入し回答を提出します。

B問題

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

ans = [0 for i in range(W)]

for i in range(H):
    C = list(input())
    for j in range(W):
        if C[j] == "#":
            ans[j] += 1
print(*ans)

グリッドの中の#を列ごとに求める問題です。
H,Wともに制約が小さいので全探索で回答することができます。

まずは、列ごとに回答するので、列[i]に何個の#があるかを数える
リストansを作っておきます。
これで例えばans[0]には列0に何個の#が入っているかを示します。

次にfor文を使ってすべてのマスを探索していきます。
イメージとしてはC[i][j]が#だとしたらans[j]に+1するという感じになります。
最後にansを出力します。
リストを空白区切りで出力するためには「*リスト」で出力できます。

C問題

N = int(input())
A = list(map(int, input().split()))

ans = [0 for _ in range(2*N+2)]

for i in range(N):
    a = A[i]
    ans[2*(i+1)] += ans[a]+1
    ans[2*(i+1)+1] += ans[a]+1

for i in range(1, 2*N+2):
    print(ans[i])

アメーバは2*N+1匹いますが、
全部探索するとTLEになりますので、
工夫が必要です。

まずは、B問題と同様にリストansを作っておきます。
ans[i]はアメーバiが何代目かを表します。
これが最終的に答えになりますね。

スクリプトのイメージを説明します。
リストAからアメーバA[i]が子供2iと2i+1を持っているわけですが、
既にアメーバA[i]は誰かの子供で、何代目かになっている可能性があります。
つまり、子供2iと2i+1はアメーバA[i]が何代目か「(ans[i])+1」が
子供の代目を表すことになります。

では、リストAを見ていきましょう。
アメーバA[i]がアメーバ2i,2i+1の親になるので、
まず、アメーバA[i]が何代目なのかをansで確認し、
2人の子供はasn[A[i]]+1代目となります。

最後にansを順番に出力します。

この記事が気に入ったらサポートをしてみませんか?