AtCoder Beginner Contest 026 C – 高橋君の給料 をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 026 C – 高橋君の給料

木の頂点をたどりながら、数値を計算していく問題。
下から順番に給料を決めていってもいいが、再帰関数を用いる方が簡単に書けるだろう。今回は構造が木&求めるのが高橋君の給料のみのため、特にメモ化なども行っていない。

# AtCoder Beginner Contest 026 C - 高橋君の給料
# https://atcoder.jp/contests/abc026/tasks/abc026_c
# tag: グラフ 木 再帰関数 高橋君

# 解き方はいろいろあると思うが、ここでは再帰関数を用いて解いている。
# 人数も少ないので、割と適当に書いてもどうにかなるだろう。

def main():
N = int(input())
path_dat = [int(input()) for _ in range(N-1)]

# 1-indexed のままグラフを構成(どっちでもいいけど……)
# グラフ~と聞くとややこしそうだが、各従業員ごとに
# 直属の部下をリストにしているだけ(隣接リスト)。
paths = [[] for _ in range(N+1)]
for i, boss in enumerate(path_dat, start=2):
paths[boss].append(i)

# 再帰関数
def get_payment(idx):
# 部下がいないなら、給料は 1
if paths[idx] == []:
return 1

# 部下がいるときは、部下の給料を取得してそこから計算
staff_payments = [get_payment(p) for p in paths[idx]]
return min(staff_payments) + max(staff_payments) + 1

# 高橋君の給料を求める
print(get_payment(1))

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です