ABC211の解説。
A - Blood Pressure
解説
平均血圧を式のとおりに実装すればAC。
$C = \frac{A-B}{3} + B$
コード
a, b = map(int, input().split())
print((a-b)/3+b)
B - Cycle Hit
解説
$4$つの文字列のなかに、H
、2B
、3B
、HR
が$1$つずつあるか判定する問題。
各文字列をリストに入れて、それぞれをcount
してすべて1であれば、AC
である。
また、リスト自体を比較するというやり方もある。
コード1
slist = list(input() for _ in range(4))
if slist.count('H') == 1 and slist.count('HR') == 1 and slist.count('2B') == 1 and slist.count('3B') == 1:
print('Yes')
else:
print('No')
コード2
slist = list(input() for _ in range(4))
alist = ['H', 'HR', '2B', '3B']
sort_slist = sorted(slist)
sort_alist = sorted(alist)
if sort_slist == sort_alist:
print('Yes')
else:
print('No')
C - chokudai
解説
文字列S
から8文字選び下線を引き、その文字が左からc, h, o, k, u, d, a, i
になるものは何通りあるかという問題。
この問題はDP(動的計画法)を用いることで求めることができる。今回は、公式解説にそって解説をしていくので、事前にこちらの解説動画を御覧いただきたい。
AtCoder Beginner Contest 211 C問題 解説
→https://www.youtube.com/watch?v=Zu9S_kJ-7tk
見ていただいたものはC++という言語で書かれているが、それをPythonに翻訳したものが以下のコードとなる。動画でやっていることをそのまま再現したものとなっている。
途中でcopy()
というものが入っているが、これは、2次元リストの書き換えが起こらないようにしたものである。答えには影響がないので、特に気にする必要はない。
また、今回の問題は競プロ典型90問の8問目と全く同じ問題なので、そちらも確認しておくことをおすすめする。
コード
import copy
s = input()
lens = len(s)
dp = [[0]*9]*(lens+1)
for i in range(lens+1):
dp[i][0] = 1
MOD = 10**9+7
t = 'chokudai'
for i in range(lens):
dp[i] = copy.deepcopy(dp[i])
for j in range(8):
if s[i] != t[j]:
dp[i+1][j+1] = dp[i][j+1]
else:
dp[i+1][j+1] = (dp[i][j+1] + dp[i][j]) % MOD
# 確認用コード
# print(dp)
print(dp[-1][-1])
編集後記
今回のC問題はコンテスト後に物議を呼んだ。
理由は、競プロ典型90問の8問目と全く同じものだったからだ。
問題はこちら。
この問題を解いていた人と、解いていなかった人で、差が生まれてしまうではないか!と議論になっていた。そんなことにならないためにも、少しずつでもいいので典型90問を解いておくことをおすすめする。