mery's Notes

めりーがプログラミングしたりします。

MENU

ABC217参加しました(A,B,C問題解説)

前回解いたやつ

 

mery-kirokudayo.hateblo.jp

f:id:mery_poke:20211101230553p:plain



 

おはようございます。

良い朝ですね(地域差あり)。

 

昨日のABC217に参戦したので感想とか書いておきます。

言語はPythonです。

 

目次

 

 

A問題

問題

A - Lexicographic Order

 

辞書順の大小を表す問題ですね。

 

minとmaxは辞書順に対応してたよなーって思いながら場合分けしていけば解ける問題でしたね。

 

僕はこんな感じのコード書いときました。

 

s,t = input().split()
if min(s,t) == s:
print("Yes")
else:
print("No")

 

s,tを配列に突っ込むと、indexが0と1になるので、if文の場合分けがかっこ良くなるかもね。

(配列のbool型のif文みたいにできるかもね)

 

B問題

問題文

B - AtCoder Quiz

 

B問題なので、言われた通りに全探索すれば解ける問題でしたね。

 

ただ、素直にやろうとすると場合分けがandでつなぎまくらないといけなくなるので、

ダルいし、めんどいし、汚いし、読みにくいしでいいことなしですよね。

 

というわけでnotを使うとif文がきれいになりました。

 

こんな感じのコードで提出しました。

 

s = []
for i in range(3):
S = input()
s.append(S)
if not("ABC" in s):
print("ABC")
elif not("ARC" in s):
print("ARC")
elif not("AGC" in s):
print("AGC")
else:
print("AHC")

 

配列の中に要素が入っているかどうかを判別するにはinを使うと便利ですね。

 

この問題、サンプルケース全部OK出たから提出したら、ARCがARHに書き間違っててWAになったなんて言えない・・・

 

C問題

問題文

C - Inverse of Permutation

 

C問題にしては珍しく、問題文の通りにやっていけばACできる問題でしたね。

 

Qpi = i をループを回して順番に入れていけばいいですね。

 

ただ、注意点として、順列P、Qが1から始まっているのに対し、

リストで対応すると始まりが0になるのが厄介ですね。

 

ということで提出したコードを

 

n = int(input())
p = list(map(int,input().split()))
q = [0]*n
for i in range(n):
q[p[i]-1] = i+1
print(*q)

 

見直したらfor文のiも0から始まってますね。

順列Qはappendでコード構築できる気がしなかったので0で初期化して、正解で置き換えていく方式でやりました。

 

あと、printでqが数値のリストの場合、 [1,2,3,4] みたいな感じで出力されて面倒くさかったです。

対策として、strにして

print("".join(str(q)),sep = " ")

でやるか、 *qでやればいいっぽいですね。

ただ、競プロだと、strに変換するとTLEが怖かったので、*qでやりました。

なのでstrの方は実行して無いので間違ってたらごめんなさい。

 

結果

目標であるC問題まで全部正解しました。

 

ただ、今回のC問題はめちゃくちゃ簡単だったらしく、Difficultyが49らしいです。

 

記事になって無いけど、前回のABCはめちゃくちゃ時間かけてB、C問題間違いまくってC問題まで解きました。そして前回の方がパフォーマンスが高かったので、自分は解くのが遅いのかぁ、、って感じました。

 

とりあえず今後もC問題まで過去問を埋めまくってコンテストいっぱい出ます。

 

それでは