「AtCoderに登録したけれど、じゃあ何すればいいの?」という方向けに、有志の方が最初に解くべき10問をまとめてくれています。
Atcoderにも精選10問をまとめたページがあります。↓
https://atcoder.jp/contests/abs/tasks
今回は、こちらの10問を「Python」で解いたコードをまとめました。
詰まってしまって解けない、なんてときにご活用ください。
各問題のリンク先では、詳しい解説や別解を書いていますので興味がありましたらぜひ~。
提出コード例と簡単な解説
それぞれの問題の提出コード例と解説です。
第 1 問: ABC 086 A – Product (100 点)
二つの整数a,bの積が、偶数か奇数かを調べます。
a, b = map(int, input().split())
if (a * b) % 2 == 0:
print("Even")
else:
print("Odd")
基本的な入力方法とif文の使い方を知っていれば解けますね。
【ABC086 A】「Product」を解く【Python3】
第 2 問: ABC 081 A – Placing Marbles (100 点)
「1」のマスがいくつあるかを求めます。
s = input()
print(s.count('1'))
count()メソッドを使用して、「1」の出現回数をカウントします。
【ABC081 A】「Placing Marbles」を解く【Python3】
第 3 問: ABC 081 B – Shift Only (200 点)
「N 個の正の整数がすべて偶数だったとき、すべてを2で割ったものに置き換える」
という操作が何回できるかを調べます。
すべて操作する方法(*別解)もありますが、ここでは1つずつ操作して、最小のものを求めています。
n = int(input())
a = list(map(int, input().split()))
ans = 100
for i in range(n):
num = a[i]
count = 0
while(True):
if num%2 == 0:
num = num//2
count += 1
else:
break
if ans>count:
ans = count
print(ans)
現在操作している数字numが奇数になるまで同じ操作を繰り返し、回数を数えます。
【ABC081 B】「Shift only」を解く【Python3】
第 4 問: ABC 087 B – Coins (200 点)
500 円玉 A 枚、100 円玉 B 枚、50 円玉 C 枚持っているときに、合計金額が X 円になる方法が何通りあるか調べます。
a, b, c, x = map(int, [input() for i in range(4)])
ans=0
for i in range(a+1):
for j in range(b+1):
for k in range(c+1):
if i*500+j*100+k*50 == x:
ans+=1
print(ans)
入力には内包表記を使用し、答えは全探索で調べています。
【ABC087 B】「Coins」を解く【Python3】
第 5 問: ABC 083 B – Some Sums (200 点)
1 以上 N 以下の整数のうち、各桁の和が A 以上 B 以下であるものの総和を求めます。
n, a, b = map(int, input().split())
ans = 0
for i in range(1,n+1):
num = sum(map(int, str(i)))
if a<=num<=b:
ans += i
print(ans)
各桁の合計値を計算して、 A 以上 B 以下であるかを確認し、条件に合えば元の整数を解答に加えます。
【ABC083 B】「Some Sums」を解く【Python3】
第 6 問: ABC 088 B – Card Game for Two (200 点)
【問題】ABC088B – Card Game for Two
Alice は Bob より何点多く取るか求めます。
n = int(input())
a = sorted(list(map(int, input().split())), reverse=True)
alice = 0
bob = 0
for i in range(n):
if i%2 == 0:
alice += a[i]
else:
bob += a[i]
print(alice-bob)
2人が大きい順にカードを取ることと同じであるため、大きい順にソートし、Alice と Bob の点数に加えます。
【ABC088 B】「Card Game for Two」を解く【Python3】
第 7 問: ABC 085 B – Kagami Mochi (200 点)
X 枚の円形の餅をいくつ縦に積み重ねられるかを求めます。
n = int(input())
d = [input() for i in range(n)]
print(len(set(d)))
重複しているものを削除し、長さを取得しています。
【ABC085 B】「Kagami Mochi」を解く【Python3】
第 8 問: ABC 085 C – Otoshidama (300 点)
青橋くんのお年玉の状況が、実際にありうるかどうか判定し、ありうる場合に候補を一つ出します。
n, y = map(int, input().split())
for i in range(n+1):
for j in range(n+1-i):
if 10000*i+5000*j+1000*(n-i-j) == y:
print(i, j, n-i-j)
exit(0)
print("-1 -1 -1")
全探索では時間が足りないため、10000 円札、5000 円札の全パターンを判定しています。
【ABC085 C】「Otoshidama」を解く【Python3】
第 9 問: ABC 049 C – Daydream (300 点)
空文字列である T の末尾に「dream, dreamer, erase, eraser」のいずれかを追加することで、与えられた文字列 S と同じものができるかどうかを判定します。
s = input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")
if s:
print("NO")
else:
print("YES")
文字列 S が、4つの文字列の組み合わせで出来ているかどうかを調べます。
【ABC049 C】「白昼夢」を解く【Python3】
第 10 問: ABC 086 C – Traveling (300 点)
シカのAtCoDeerくんのプランが、実行可能かどうか判定します。
n = int(input())
txy=[list(map(int,input().split())) for _ in range(n)]
p = [0,0,0]
for i in range(n):
step = abs(txy[i][1]-p[1])+abs(txy[i][2]-p[2])
time = txy[i][0]-p[0]
if time>=step and (time-step)%2 == 0:
p = txy[i]
continue
else:
print("No")
exit(0)
print("Yes")
一つ前の時刻から今の時刻までに進んだ距離を計算し、それが可能かどうか判定しています。
【ABC086 C】「Traveling」を解く【Python3】
この後はどうする?
過去問精選10問を解いた後は、以下の記事もおすすめです。