AtCoder Beginner Contest 179をPythonで解く

投稿日:  更新日:2022/09/02

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回はAtCoder Beginner Contest 179を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - Plural Form

文字列に対して, リストのように[1]や[2], [-1]等をつけることによって, ○文字目の文字を抽出することができます.

s = input()
if s[-1] == "s":
s += "es"
else:
s += "s"
print(s)

B - Go to Jail

問題文にあるゾロ目の条件を順に確かめればよいです. ループの条件に注意しましょう.

N = int(input())
# 配列Dの作成
D = []
for i in range(N):
D += [[int(x) for x in input().split()]]
# ゾロ目判定
for i in range(N-2):
if D[i][0] == D[i][1] :
if D[i+1][0] == D[i+1][1] :
if D[i+2][0] == D[i+2][1] :
print("Yes")
exit()
# ゾロ目が出なかったらNo
print("No")

C - A x B + C

A×B<Nを満たす自然数の組(A,B)に対して, ある自然数Cを適当に選ぶことでA×B+C=Nとなります. ゆえに, 自然数の組(A,B)に関してだけ気にすればよいです.

Aを固定した場合, A×B<Nを満たすBN1A個だけあります(ただし,  はGauss記号で, xxを超えない最大の整数です). それをA=1からA=N1まで足し上げればよいでしょう.

N = int(input())
ans = 0
# 最初にAを固定する
# Aは1からN-1まで可能性がある
for i in range(1,N):
# Bは(N-1)//A(N-1をAで割った商)の個数だけある
# Cは残りを足すだけなので, 上記のA, Bの組に対してあるCが1つ定まる
ans += (N-1) // i
print(ans)

D - Leaping Tak

動的計画法(dynamic programming)による簡単な解決方法として, 以下のようなものが考えられます.

  1. [Li,Ri]の和集合としてSを作る.
  2. 配列dpを, 「dp[i]:(i+1)番目のマス目に到達する場合の数」として定義する.
  3. dp[0]に関して, 1番目のマス目に到達する場合の数は「高橋君は現在マス1にいる」という意味で1通りとする.
  4. 1番目のマス目から(N1)番目のマスに関して, 集合Sで定められたd(S)マス分の移動移動を試す. その際, i番目のマス目に到達する場合の数を(i+d)番目のマス目に到達する場合の数に加えていく.

最終的に, 配列dpに「dp[i]:(i+1)番目のマス目に到達する場合の数」が入るようになります. しかし, これでは計算量がO(N2)(集合Sの要素数も高々N個存在する)になってしまうので, TLE.

# 入力
N, K = [int(x) for x in input().split()]
MOD = 998244353
# [L, R]の和集合となる集合Sを作成
S = []
for i in range(K):
L, R = [int(x) for x in input().split()]
for j in range(L, R+1):
S.append(j)
# dp[i]:(i + 1)番目のマス目に到達する場合の数
# dp[0] = 1:1番目のマス目に到達する場合の数は「高橋君は現在マス1にいる」という意味で1通り
dp = [0]*N
dp[0] = 1
# 1番目のマス目から(N - 1)番目のマスに関して, 集合Sで定められた移動を試す
for i in range(N - 1):
if dp[i] > 0:
for d in S:
# 移動によってN番目のマス目を超えないかチェック
if i + d < N:
# i番目のマス目に到達する場合の数を(i + d)番目のマス目に到達する場合の数に加える
dp[i + d] += dp[i]
# 出力
print(dp[N - 1] % MOD)

これを解決する方法については, まだ私の理解が追い付いていないので記載しません. 理解できたときに記載します.

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels

Blog Archives