note表紙

Pythonで歩む競プロ

ということで、やっていきます。まず手始めに、AtCoder Beginner Contest,通称ABCをやっていきます。名前の通り初心者向けのコンテストです。最新の問題ABC137のB問題について書きます。

数直線上に 2000001個の石が置かれています。これらの石の座標は −1000000,−999999,−999998,…,999999,1000000です。
これらの石のうち、ある連続する K個の石が黒で塗られており、それ以外の石は白で塗られています。
 また、座標 Xにある石は黒で塗られていることが分かっています。
黒で塗られている石が置かれている可能性のある座標をすべて、小さい順に出力してください。

B- One Clue

さあ、やっていきましょう。数直線らしいので、数直線を実際に書いてみます。

そして連続するK個が黒で他全部が白と。そして座標X。文字で起こすより図で考えます。

偶とか奇とかは気にしないでください。関係なかったです。

だいぶ見えてきたように思えます。次に仮説というか、使えそうな式等々を考えていきます。

さて、あとは実装です。ループさせたらいいんかな?と思ってwhileを使ってみました。表示して1足して表示して、変数ans1とans2が同値になったらいけるかな?

と思いましたが、どうもうまくいきません。例題の数値で試しても思った結果になりませんでした。じゃあwhile Trueじゃなくてfor構文でやってみるか。

k, x = map(int, input().split())

for i in range(x-k+1, x+k):
   print(i)

こうすると上手くいきました!なるほど、for構文なんですね。勉強になりました。ちなみにこれだと、横一列に表示ではなく縦一列に表示されます。それが嫌だったら、

k, x = map(int, input().split())

for i in range(x-k+1, x+k):
   print(i, end=" ")

とすると、横一列に出力されるはずです。

これを提出するとACを貰えました!これでB問題は終了です。お疲れ様でした。

こんな感じの投稿をしていこうと思います。

いただきましたサポートは私のモチベとして次作に還元させていただきます!!