[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を順番に出力します。
この記事が気に入ったらサポートをしてみませんか?