ABC257Python自己満解説
あちゃぴです。初めて書いてみます。自己満ですw
とりあえず最初は灰色diffのみ解説していきます。
diffとはAtCoder Problemsのサイトの基準で
diffが400だったらレートが400の人が50%の確率で解くことができるというものです。
なのでdiff<400のものだけを解説します。
問題はこちらです→ABC257の問題
解説用にコードを綺麗に(できるだけ)してます。
ペナとはペナルティーの略でACにならなかったことです。
ペナ率とは全ての提出のうちペナになった提出の割合です。
A問題
計算でO(1)で求めることもできますが、ペナ率が34.56%らしいのでこういったペナをなくすためには愚直にやるのが大事かもしれないです。
この場合だと愚直に得られる文字列を作成して、X番目なので添字はX-1となりそれを出力すればACです。
N,X=map(int,input().split())
Al="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
S=""
for i in range(26):
#Al[i]にはA~Zのi番目、Al[i]*NとはAl[i]をN個繋げたものである。
S+=Al[i]*N
print(S[X-1])
ちなみにコメントの部分を解説すると文字列に数字を掛けるとその文字列をN回繰り返した文字列になります。
print("Hi!"*10)
Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!
B問題
これも愚直にシュミレーションします。
Q回操作してi回目はL[i]について操作します。
L[i]をL[i]-1にしてる理由は添字です。
左からL[i]番目のコマの場所を取得するためにはA[L[i]-1]
で取得できます。
「左からL[i]番目のコマが一番右のマスにあるならば何も行わない。」とあるので、A[L[i]-1]
がNじゃないときに操作します。それを最初のif文if A[L[i]-1]!=N
で判定してます。
「そうでない時、左からL[i]番目のコマがあるマスの1つ右のマスにコマが無いならば、左からL[i]番目のコマを1つ右のマスに移動させる。1つ右のマスにコマがあるならば、何も行わない。」
1つ右のマスにコマがあるかどうかを判定するには、A[L[i]-1]+1
が配列Aの中にに含まれていたら1つ右のマスにコマがある、含まれていなければコマはないとすればよいです。
それは2つ目のif文if not A[L[i]-1]+1 in A
で判定してます。
その後2つの条件にクリアした場合のみA[L[i]-1]+=1
でA[L[i]-1]
のコマを一つ右にずらします。
結果を出力するときにprint(*配列)
とやれば配列の中身を空白区切りで出力することができます。演算子と混合しないように気をつけてください。これはよく使うので覚えておくといいでしょう。
N,K,Q=map(int,input().split())
A=list(map(int,input().split()))
L=list(map(int,input().split()))
for i in range(Q):
if A[L[i]-1]!=N:
if not A[L[i]-1]+1 in A:
A[L[i]-1]+=1
print(*A)
ちなみにprint(*配列)
を空白区切りじゃなくて区切りなしや改行区切りにしたいときはsep=何で区切るか
とprintのなかに書けば良い。
区切りなしにしたい場合はprint(*配列,sep"")
改行区切りにしたい場合はprint(*配列,sep"\n")
文字"."で区切りたい場合はprint(*配列,sep".")
S=[1,100,"Hello"]
print(*S)
1 100 Hello
S=[1,100,"Hello"]
print(*S,sep="&")
1&100&Hello
S=["H","E","L","L","O"]
print(*S,sep="")
HELLO
S=[1,22,333,4444,55555,666666]
print(*S,sep="\n")
1
22
333
4444
55555
666666
以上、自己満解説でした。
間違っているとこがあったら教えてくれたら嬉しいです!