mery's Notes

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

MENU

AtCoder Beginner Contest (ABC) 191 PythonでA,B問題解いてみた

前回解いたやつ

mery-kirokudayo.hateblo.jp

f:id:mery_poke:20211101225837p:plain

こんにちは。メリーです。

というわけで今日も元気にABC解いて行きます。
言語はPython、提出はPyPyです。

目次

A問題

問題文

A - Vanishing Pitch

消える魔球の問題ですね。
はるか昔に野球盤で実装されたことがありましたね。
誕生日か何かで買ってもらって遊んだ記憶がありますが、あまりはまりませんでした。

そんなこんなで解き方の方針です。
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問題

問題文

B - Remove It

数列の特定の要素を除いた数列を表示する問題ですね。

愚直に、問題分の通りに配列を削除して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が開催されるらしいので、参加します。

頑張りましょう!!!

それでは