概要
表題のプログラミング言語でAtCoder Beginners Selectionを実施記録した際の記録です
基本文法の学習が目的です
https://atcoder.jp/contests/abs
AtCoder Beginners Selectionとは?
このコンテストは、「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集です。
問題は、dr.kenさんの、「AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~」から選出しています。
基本的には以下ができれば大体の問題を解けるようになっている。
- 標準入力
- 標準出力
- 四則演算
- 条件分岐
- 文字列操作
- ループ
- 配列の操作
- 全通りの探索
- 組み込み関数等の利用
- ソート
- 集合
- 二次元配列の操作
PracticeA - Welcome to AtCoder
PracticeA - Welcome to AtCoder
問題文
高橋君はデータの加工が行いたいです。
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。制約
1≤a,b,c≤1,000
1≤∣s∣≤100入力
入力は以下の形式で与えられる。
a
b c
s出力
a+b+c と s を空白区切りで 1 行に出力せよ。
基本的な標準入力、標準出力、四則演算ができればOK
# 入力
a = int(input())
b, c = map(int, input().split())
s = input()
# a+b+c の計算
result = a + b + c
# 結果を出力
print(result, s)
ABC086A - Product
問題文
シカのAtCoDeerくんは二つの正整数 a,b を見つけました。 a と b の積が偶数か奇数か判定してください。制約
1 ≤ a,b ≤ 10000
a,b は整数入力
入力は以下の形式で標準入力から与えられる。
a b出力
積が奇数なら Odd と、 偶数なら Even と出力せよ。
基本的な標準入力、標準出力、四則演算、条件分岐ができればOK
# 入力を受け取る
a, b = map(int, input().split())
# aとbの積が奇数か偶数かを判定する
if (a * b) % 2 == 0:
# 偶数の場合
print("Even")
else:
# 奇数の場合
print("Odd")
ABC081A - Placing Marbles
問題文
すぬけ君は 1,2,3 の番号がついた 3 つのマスからなるマス目を持っています。各マスには 0 か 1 が書かれており、マス i には si が書かれています。
すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。制約
s1 ,s2 ,s3 は 1 あるいは 0入力
入力は以下の形式で標準入力から与えられる。
s1s2s3出力
答えを出力せよ。
基本的な標準入力、標準出力、文字列操作ができればOK
# 入力値を取得
s = input()
# 1が書かれたマスの数を数える
count = 0
for si in s:
if si == "1":
count += 1
# 結果を出力
print(count)
ABC081B - Shift only
問題文
黒板に N 個の正の整数 A1,...,AN が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.制約
1≤N≤200
1≤Ai≤10^9入力
入力は以下の形式で標準入力から与えられる。
N
A1 A2 ... AN出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.入力例 1
3
8 12 40出力例 1
2
基本的な標準入力、標準出力、四則演算、ループ、条件分岐、配列の操作ができればOK
# 入力値を読み込む
n = int(input())
a = list(map(int, input().split()))
# 操作を行う回数を初期化する
ans = 0
# 操作を繰り返す
while True:
# 整数がすべて偶数かどうかを判定する
all_even = True
for i in range(n):
if a[i] % 2 == 1:
all_even = False
break
# 整数がすべて偶数でない場合、終了する
if not all_even:
break
# 整数をすべて2で割る
for i in range(n):
a[i] /= 2
# 操作を行った回数を増やす
ans += 1
# 結果を出力する
print(ans)
ABC087B - Coins
問題文
あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。制約
0≤A,B,C≤50
A+B+C≥1
50≤X≤20,000
A,B,C は整数である
X は 50 の倍数である入力
入力は以下の形式で標準入力から与えられる。
A
B
C
X出力
硬貨を選ぶ方法の個数を出力せよ。
基本的な標準入力、標準出力、四則演算、ループ、条件分岐、配列の操作、全通りの探索ができればOK
# 入力
a = int(input()) # 500 円玉の枚数
b = int(input()) # 100 円玉の枚数
c = int(input()) # 50 円玉の枚数
x = int(input()) # 目標金額
# 答えを格納する変数
ans = 0
# 500 円玉、100 円玉、50 円玉を選ぶ全ての組み合わせについて調べる
for i in range(a+1):
for j in range(b+1):
for k in range(c+1):
# 500a+100b+50c=X が成り立つかどうか調べる
if 500*i + 100*j + 50*k == x:
ans += 1
# 答えを出力
print(ans)
ABC083B - Some Sums
問題文
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。制約
1≤N≤10^4
1≤A≤B≤36
入力はすべて整数である入力
入力は以下の形式で標準入力から与えられる。
N A B出力
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を出力せよ。
基本的な標準入力、標準出力、四則演算、ループ、条件分岐、配列の操作、組み込み関数の利用、ができればOK
n, a, b = map(int, input().split())
result = 0
for i in range(1, n+1):
# 各桁の和を求める
digits_sum = sum(map(int, str(i)))
# A以上B以下の値であるかどうかを判定する
if a <= digits_sum <= b:
result += i
# 結果を出力する
print(result)
ABC088B - Card Game for Two
問題文
N 枚のカードがあります. i 枚目のカードには, ai という数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.制約
N は 1 以上 100 以下の整数
ai(1≤i≤N) は 1 以上 100 以下の整数入力
入力は以下の形式で標準入力から与えられる.
N
a1 a2 a3 ... aN出力
両者が最適な戦略を取った時, Alice は Bob より何点多く取るかを出力してください.
基本的な標準入力、標準出力、四則演算、条件分岐、配列の操作、ループ、ソート、ができればOK
n = int(input())
a = sorted(map(int, input().split()), reverse=True)
ans = 0
for i in range(n):
if i % 2 == 0:
# Alice 取得
ans += a[i]
else:
# Bob 取得
ans -= a[i]
print(ans)
ABC085B - Kagami Mochi
問題文
X 段重ねの鏡餅 (X≥1) とは、X 枚の円形の餅を縦に積み重ねたものであって、どの餅もその真下の餅より直径が小さい(一番下の餅を除く)もののことです。例えば、直径 10、8、6 センチメートルの餅をこの順に下から積み重ねると 3 段重ねの鏡餅になり、餅を一枚だけ置くと 1 段重ねの鏡餅になります。
ダックスフンドのルンルンは N 枚の円形の餅を持っていて、そのうち i 枚目の餅の直径は diセンチメートルです。これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。制約
1≤N≤100
1≤di≤100
入力値はすべて整数である。入力
入力は以下の形式で標準入力から与えられる。
N
d1
:
dN出力
作ることのできる鏡餅の最大の段数を出力せよ。入力例 1
4
10
8
8
6出力例 1
3
基本的な標準入力、標準出力、四則演算、ループ、配列、集合、ができればOK
N = int(input())
A = [int(input()) for _ in range(N)]
s = set()
for i in A:
s.add(i)
print(len(s))
ABC085C - Otoshidama
問題文
日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。
青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が N 枚入っていて、合計で Y 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。制約
1≤N≤2000
1000≤Y≤2×10^7
N は整数である。
Y は 1000 の倍数である。入力
入力は以下の形式で標準入力から与えられる。
N Y出力
N 枚のお札の合計金額が Y 円となることがありえない場合は、-1 -1 -1 と出力せよ。
N 枚のお札の合計金額が Y 円となることがありうる場合は、そのような N 枚のお札の組み合わせの一例を「10000 円札 x 枚、5000 円札 y 枚、1000 円札 z 枚」として、x、y、z を空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。入力例 1
9 45000出力例 1
4 0 5
基本的な標準入力、標準出力、四則演算、ループができればOK
n, y = map(int, input().split()) # N 枚、Y 円を入力
# 10000 円札の枚数を 0 枚から N 枚まで変化させて、合計金額が Y 円になるかどうかを判定
for i in range(n + 1):
# 5000 円札の枚数を 0 枚から N - i 枚まで変化させて、合計金額が Y 円になるかどうかを判定
for j in range(n - i + 1):
# 1000 円札の枚数を N - i - j 枚とする
k = n - i - j
# 合計金額が Y 円になるかどうかを判定
if (10000 * i + 5000 * j + 1000 * k) == y:
# 合計金額が Y 円になる場合は、その枚数の組み合わせを出力してプログラムを終了
print(i, j, k)
exit()
# 合計金額が Y 円になる枚数の組み合わせが見つからなかった場合は、-1 -1 -1 を出力
print(-1, -1, -1)
ABC049C - 白昼夢
問題文
英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。制約
1≦∣S∣≦10^5
S は英小文字からなる。入力
入力は以下の形式で標準入力から与えられる。
S出力
S=T とすることができる場合 YES を、そうでない場合 NO を出力せよ。入力例 1
erasedream出力例 1
YES
基本的な標準入力、標準出力、文字列操作ができればOK
# 入力
S = input()
# 操作を繰り返す
while len(S) > 0:
# Tの末尾にdream, dreamer, erase, eraserのいずれかを追加する
if S.endswith('dream'):
# Sの末尾からdreamを削除する
S = S[:len(S) - len('dream')]
elif S.endswith('dreamer'):
# Sの末尾からdreamerを削除する
S = S[:len(S) - len('dreamer')]
elif S.endswith('erase'):
# Sの末尾からeraseを削除する
S = S[:len(S) - len('erase')]
elif S.endswith('eraser'):
# Sの末尾からeraserを削除する
S = S[:len(S) - len('eraser')]
else:
# Sの末尾がdream, dreamer, erase, eraserのいずれでもない場合は、S=Tとすることができない
print("NO")
exit()
# S=Tとすることができる
print("YES")
ABC086C - Traveling
問題文
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻tiに 点 (xi,yi) を訪れる予定です。
AtCoDeerくんが時刻 t に 点 (x,y) にいる時、 時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。 その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。制約
1 ≤ N ≤ 10^5
0 ≤ xi ≤ 10^5
0 ≤ yi ≤ 10^5
1 ≤ ti ≤ 10^5
ti < ti+1 (1 ≤ i ≤ N−1)
入力は全て整数入力
入力は以下の形式で標準入力から与えられる。
N
t1 x1 y1
t2 x2 y2
:
tN xN yN出力
旅行プランが実行可能ならYesを、不可能ならNoを出力してください。入力例 1
2
3 1 2
6 1 1出力例 1
Yes入力例 2
1
2 100 100出力例 2
No
(0,0) にいる状態から 2 秒後に (100,100) にいるのは不可能です。入力例 3
2
5 1 1
100 1 1出力例 3
No
基本的な標準入力、標準出力、四則演算、ループ、二次元配列の操作、ができればOK
n = int(input())
t = 0
x = 0
y = 0
for i in range(n):
ti, xi, yi = map(int, input().split())
if abs(xi - x) + abs(yi - y) > ti - t or (ti - t - abs(xi - x) - abs(yi - y)) % 2 != 0:
print("No")
break
t = ti
x = xi
y = yi
else:
print("Yes")
参考