◎3問目 ABC081B - Shift only
B - Shift only
問題文
黒板に N 個の正の整数 A1,…,AN が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.
制約
1≤N≤200
1≤Ai≤109
入力
入力は以下の形式で標準入力から与えられる。
N
A1 A2 ... AN
出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.
n=int(input())
a = list(map(int,input().split()))
"""必要な関数等
・全て偶数であった回数をカウントする変数。
・配列の何個目かカウントする変数。
"""
"""必要な処理
1. 偶数かどうか
→偶数なら、2で割った者を更新
→一つでも偶数でないものがあったら終了。
"""
count=0
count2=0
ok=True
while ok==True:
for i in a:
if i%2==0:
if count==n:
a = [s/2 for s in a]
count=0 #配列の何個目かカウントする変数
count2+=1 #全て偶数であった回数をカウントする変数。
break
count+=1
continue
else:
ok=False
break
print(count2)
こちらの方がシンプルで分かりやすいかもしれません。フラグ(flag)はよく使う概念です。
n = int(input())
a = list(map(int, input().split()))
cnt = 0
flag = True
while flag:
for i in range(n):
if a[i] % 2 == 0:
a[i] //= 2
else:
flag = False
break
if flag:
cnt += 1
else:
break
print(cnt)
参照元:
https://onecheese.com/2021/11/26/atcoder-abc-081-b/
◎9問目 ABC049C - 白昼夢 / Daydream
C - Daydream
問題文
英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
T の末尾に dream dreamer erase eraser のいずれかを追加する。
制約
1≦|S|≦105
S は英小文字からなる。
入力
入力は以下の形式で標準入力から与えられる。
S
出力
S=T とすることができる場合 YES を、そうでない場合 NO を出力せよ。
s = input()
while s: #文字列が全てなくなる(空白)になるまで続ける。
for query in ("erase", "eraser", "dream", "dreamer"):
if s.endswith(query):
s = s[:-len(query)] #s[0:-len(query):1]と同義。すなわち、query分を末尾から削除したsに更新する。
break #それを囲んでいる最も内側のループ(for文や次回取り上げるwhile文)を終了させる。
else: # breakされなかったとき、つまり、"erase", "eraser", "dream", "dreamer"どれも合致しなかった場合。elseを配置する場所(インデント回数)に注意。
print('NO')
exit()
print('YES')
◎10問目 ABC086C - Traveling
C - 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 ≤ 105
0 ≤ xi ≤ 105
0 ≤ yi ≤ 105
1 ≤ ti ≤ 105
ti < ti+1 (1 ≤ i ≤ N−1)
入力は全て整数
入力
入力は以下の形式で標準入力から与えられる。
N
t1 x1 y1
t2 x2 y2
:
tN xN yN
出力
旅行プランが実行可能ならYesを、不可能ならNoを出力してください。
n = int(input())
plans = []
#入力受け取り。t,x,yを一行ずつ受け取る。後々扱いやすいため。
for _ in range(n):
plans.append(map(int, input().split()))
#移動するひとつ前の時間と座標。条件より、初期値は全て0。
st = sx = sy = 0
for t, x, y in plans:
#ひとつ前からの移動時間と移動距離。
dt, dx, dy = t - st, abs(x - sx), abs(y - sy)
#時間と移動距離の偶奇が等しいかどうか。
#旅行プランが実現可能ならば、移動距離は移動時間以下のはず。同じところ行ったり来たりする可能性があるから。
if t % 2 != (x + y) % 2 or dx + dy > dt:
print('No')
exit()
#移動するひとつ前の時間と座標として保存しておく。
st, sx, sy = t, x, y
print('Yes')
(https://delta114514.hatenablog.jp/entry/2018/03/15/014555#10%E5%95%8F%E7%9B%AE-ABC086C---Traveling
から拝借。とてもシンプルで良いコード。)
おすすめの本
アルゴリズム実技検定 公式テキスト[エントリー~中級編] (Compass Booksシリーズ)
アルゴリズム的思考力が身につく! プログラミングコンテストAtCoder入門
「AtCoder Beginners Selection」のリンク