鹿島建設プログラミングコンテスト2024(AtCoder Beginner Contest 340)の解説記事です。
目次
ABC340 A – Arithmetic Progression
問題
問題文の要約は以下の通りです。
問題の要約
初項が \(A\) 、末項が \(B\) 、公差が \(D\) であるような等差数列を出力せよ。
制約
・\(1 \le A \le B \le 100\)
・\(1 \le D \le 100\)
・初項が \(A\) 、末項が \(B\) 、公差が \(D\) であるような等差数列が存在する
・入力は全て整数
入力
\(A\) \(B\) \(D\)
出力
初項が \(A\) 、末項が \(B\) 、公差が \(D\) であるような等差数列の項を順に空白区切りで出力せよ。
解説
while
文を使用する。
解説
\(A\), \(B\), \(D\) をint
型として受け取ります。
# 入力
A,B,D=map(int,input().split())
\(A \lt B\) の間は公差を足して出力します。
# A<Bの間は公差を足して出力
while A<B:
print(A,end=' ')
A+=D
最後に末項を出力します。
# 最後に末項を出力
print(B)
解答
# 入力
A,B,D=map(int,input().split())
# A<Bの間は公差を足して出力
while A<B:
print(A,end=' ')
A+=D
# 最後に末項を出力
print(B)
ABC340 B – Append
問題
解説
リストを使用してクエリを処理する。
解説
次に入力 \(Q\) をint
型として受け取ります。
# 入力
Q=int(input())
空の数列をlist
で用意します。
# 数列
A=[]
\(Q\) 回クエリを処理します。
リストの末尾に追加するにはappend
、後ろからk番目の値を求めるにはA[-k]
とします。
# Q回クエリを処理する
for _ in range(Q):
t,k=map(int, input().split())
# 末尾にkを追加する
if t==1:
A.append(k)
# 後ろからk番目の値を求める
else:
print(A[-k])
解答
# 入力
Q=int(input())
# 数列
A=[]
# Q回クエリを処理する
for _ in range(Q):
t,k=map(int, input().split())
# 末尾にkを追加する
if t==1:
A.append(k)
# 後ろからk番目の値を求める
else:
print(A[-k])
ABC340 C – Divide and Divide
問題
解説
メモ化再帰を用いる。
解説
メモ化再帰を行うことで入力が同じ関数を何回も呼び出さなくなるため、高速に処理できます。
メモ化再帰を行うにはfunctools.cache
のimportを行い、@cache
というデコレータを付けることで自動的に行われます。
from functools import cache
# 入力
Q=int(input())
解答
from functools import cache
# メモ化再帰
@cache
def erase(N):
# 1の時は処理終了
if N==1:
return 0
# 2 個の整数を黒板に書き、N円支払う
else:
return erase(N // 2) + erase((N + 1) // 2) + N
# 入力
N=int(input())
# 出力
print(erase(N))