AtCoder Beginner Contest (ABC) 191 PythonでA,B問題解いてみた
前回解いたやつ
こんにちは。メリーです。
というわけで今日も元気にABC解いて行きます。
言語はPython、提出はPyPyです。
目次
A問題
問題文
消える魔球の問題ですね。
はるか昔に野球盤で実装されたことがありましたね。
誕生日か何かで買ってもらって遊んだ記憶がありますが、あまりはまりませんでした。
そんなこんなで解き方の方針です。
1. 球が消えている範囲を調べる。
2. Dメートルがその範囲内に入っているかをチェックする。
という方針でやって見ましょう。
以下がコードです。
v,t,s,d = map(int,input().split()) kukan = list(range(v*t,v*s+1)) if d in kukan: print("No") else: print("Yes")
kukanという変数に球が消えている範囲を格納してます。
rangeの2つ目の引数をv*sにすると範囲が狭くなるので注意です。
そして、次のif文で区間内にDが存在するかをチェックします。
範囲内にあれば球は見えず、打てないのでNoを、
範囲内になければ球は見え、打てるのでYesを出力します。
B問題
問題文
数列の特定の要素を除いた数列を表示する問題ですね。
愚直に、問題分の通りに配列を削除してAを出力しようとするとつまずきます。
例:for文で回すときに配列を削除するとインデックスが変更される。
whileでremoveすると時間が足りず、TLEとなる。など
以下実際にTLEになった例です。
n, x = map(int,input().split()) a = list(map(int,input().split())) while x in a: a.remove(x) print(*a)
whileが遅いのか、removeが遅いのか、Pythonが遅いのが問題なのかわかりませんが、このコードだと、1ケースだけTLEに引っかかります。
なので、以下の方針でやりました。
1. ループをn回回す。
2. a[i] = x となる要素以外はリストansに格納する。
3. 最後にansを出力する。
という方針でやっていきます。
以下正解コード
n, x = map(int,input().split()) a = list(map(int,input().split())) ans = [] for i in range(n): if not(a[i] == x): ans.append(a[i]) print(*ans, sep=' ')
リスト内包表記を使えば速いらしいですが、十分高速だし、見やすいので使ってません。
わからないとも言う
あんまり解説することも無いです。
ほんとにまじで方針通りにコードを書いてるだけです。
強いて言うなら、printする時に、int型のリストであれば
print(*list)
とすることで、
[1,2,3]
が
1 2 3
と出力されるので便利です。
str型であれば
" ".join(list)
で出力できます。
という感じです。
今日の夜にはABC218が開催されるらしいので、参加します。
頑張りましょう!!!
それでは