LoginSignup
0
0

More than 1 year has passed since last update.

【AtCoder】ABC211をPython3で解説

Posted at

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$つの文字列のなかに、H2B3BHRが$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問を解いておくことをおすすめする。

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