AtCoder Beginner Contest 350(Promotion of AtCoderJobs)の解説記事です。
ABC350 A – Past ABCs
問題
問題文の要約は以下の通りです。
問題の要約
長さ 6 の文字列 \(S\) が与えられます。\(S\) の先頭 3 文字は ABC であり、末尾 3 文字は数字であることが保証されます。 \(S\) がABC001,ABC002,……,ABC314,ABC315,ABC317,ABC318,……,ABC348,ABC349の文字列のうちいずれかに等しいか判定せよ。
解説
文字列として大小関係を判定する。
解説
まず入力を受け取ります。
# 入力
S=input()文字列として大小関係を判定します。 \(S\) がABC001からABC315まで、もしくはABC317からABC349までであればYesをそうでなければNoを出力します。
# 文字列として大小関係を判定する
if 'ABC001'<=S<='ABC315' or 'ABC317'<=S<='ABC349':
print('Yes')
else:
print('No')解答
# 入力
S=input()
# 文字列として大小関係を判定する
if 'ABC001'<=S<='ABC315' or 'ABC317'<=S<='ABC349':
print('Yes')
else:
print('No')ABC350 B – Dentist Aoki
問題
問題文の要約は以下の通りです。
問題の要約
高橋君の \(N\) 個の穴には初めに1本ずつ歯が生えています。青木君は \(Q\) 回の治療を行い、治療がある穴に対して歯があれば抜き、なければ生やします。最終的に、高橋君に生えている歯の本数を求めよ。
解説
各穴に歯が生えているかどうかをリストで管理する。
解説
まず入力を受け取ります。
# 入力
N,Q=map(int, input().split())
T=list(map(int, input().split()))各穴に歯が生えているかどうかを表すリストteethを作成し、最初はすべての穴に歯がある状態(1)で初期化します。0-indexedのため穴0を追加します。
# 各穴に歯が生えているかどうかを表すリスト(0-indexedのため穴0を追加する)
teeth = [0]+[1 for _ in range(N)]Q回の治療を行います。各治療では、歯があれば抜き(値を0)、歯がなければ生やします(値を1)。これは、teeth[t] = 1 - teeth[t]というコードで実現できます。
# Q回の治療を行う
for t in T:
# 生えていれば抜き、生えていなければ生やす
teeth[t] = 1 - teeth[t]最終的に、高橋君に生えている歯の本数(リストの値1の合計)を求め、出力します。
# 結果を出力
print(sum(teeth))解答
# 入力
N,Q=map(int, input().split())
T=list(map(int, input().split()))
# 各穴に歯が生えているかどうかを表すリスト(0-indexedのため穴0を追加する)
teeth = [0]+[1 for _ in range(N)]
# Q回の治療を行う
for t in T:
# 生えていれば抜き、生えていなければ生やす
teeth[t] = 1 - teeth[t]
# 結果を出力
print(sum(teeth))ABC350 C – Sort
問題
問題文の要約は以下の通りです。
問題の要約
1 から \(N\) までの数字が一回ずつ現れる数列を与えられます。この数列の2つの要素を 0 回以上 \(N-1\) 回以下の回数、入れ替えることで昇順に並び替えよ。
解説
数列内の各数値の位置を記録し、前から順番に入れ替えを行う。
解説
まず入力を受け取ります。Aのインデックスは 1 から始まるので0番目の要素に0を追加して1-indexedにします。
# 入力
N = int(input())
# 0番目の要素に0を追加して1-indexedにする
A = [0] + list(map(int, input().split()))数列Aの各要素の位置を記録する配列 pos を初期化し、要素の位置を pos に記録します。
# 各数値の位置を記録する配列
pos = [0] * (N + 1)
# 入力された数列 A の各要素の位置を pos に記録
for i in range(1, N + 1):
pos[A[i]] = i1 からNまでの各要素iに対して、A[i]がiでないとき、正しい位置にある要素と交換します。問題文にi<jという条件があるのでi>jであればiとjを入れ替えます。
# 操作を格納するリスト
ans = []
# 1 から N までの各要素 i について、それが正しい位置にあるか確認し、なければ修正
for i in range(1, N + 1):
# A[i] が i でないとき、正しい位置にある要素と交換する
if A[i] != i:
# A[i]の位置を取得
j = pos[i]
# i>jであれば入れ替える
if i>j:
i,j=j,i
# 操作を追加
ans.append((i, j))
# A[i] と A[j] を交換
A[i], A[j] = A[j], A[i]
# pos も更新
pos[A[j]] = j
pos[A[i]] = i最後に操作の回数と具体的な操作の内容を出力します。
# 操作の回数と操作を出力
print(len(ans))
for a in ans:
print(*a)解答
# 入力
N = int(input())
# 0番目の要素に0を追加して1-indexedにする
A = [0] + list(map(int, input().split()))
# 各数値の位置を記録する配列
pos = [0] * (N + 1)
# 入力された数列 A の各要素の位置を pos に記録
for i in range(1, N + 1):
pos[A[i]] = i
# 操作を格納するリスト
ans = []
# 1 から N までの各要素 i について、それが正しい位置にあるか確認し、なければ修正
for i in range(1, N + 1):
# A[i] が i でないとき、正しい位置にある要素と交換する
if A[i] != i:
# A[i]の位置を取得
j = pos[i]
# i>jであれば入れ替える
if i>j:
i,j=j,i
# 操作を追加
ans.append((i, j))
# A[i] と A[j] を交換
A[i], A[j] = A[j], A[i]
# pos も更新
pos[A[j]] = j
pos[A[i]] = i
# 操作の回数と操作を出力
print(len(ans))
for a in ans:
print(*a)
