Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

AtCoder Beginner Contest 158 感想&解説

AtCoder Beginner Contest 158が終了し、解説も掲載されたみたいですね。

皆さん、お疲れ様でございました!

 

まずは今回の反省から。

 

4完90分(6WA)でした(多くないか...?)

今回 BとCで3WAとなってしまいました...どちらもプログラムを少し直せば治ったのでこのWAはなくせたはず....!!

 

感想としては

A問題-はい

B問題-ループじゃないな

C問題-条件ループだけ?

D問題-実装がむずい、Pythonの計算量解析が難しい

 

って感じでしたね

 

では、さっそくそれぞれの問題の解説から。

A問題

https://atcoder.jp/contests/abc158/tasks/abc158_a

これは簡単です。Sについてリストに入れて、あとはset→list化しその要素数

判定すればよいです。(要素1なら"No",要素数2なら"Yes")

 

B問題

https://atcoder.jp/contests/abc158/tasks/abc158_b

10^{100}というのを見てループではないと確信。いやしかし判定方法の考察に時間がかかってしまったorz

 条件分岐:

[1]  N<A: Nを出力

[2] A = N or N ≦(A+B): Aを出力

[3]それ以外

 もしNを(A+B)で割ったあまりがAより大きいなら N÷(A+B)の商+Aを出力

 そうでなければN÷(A+B)の商+N÷(A+B)のあまりを出力

C問題

https://atcoder.jp/contests/abc158/tasks/abc158_c

ループ問題(i = 1 から適当な数 10^{5}くらいまでのループを作成)

Pythonならばmath.floor()という関数があり、それでi*1.08,i*1.1を小数点以下切り捨てした値がそれぞれA,Bに等しければループを終了します。そして、そこで

iを出力すればよいです。

 

D問題

https://atcoder.jp/contests/abc158/tasks/abc158_d

この問題、どこかで見たことあるなと思いました。思い出してみると-ARC077のA問題がそれの類題であったように思いました。

https://atcoder.jp/contests/abc066/tasks/arc077_a

この問題の場合は

1. 数列Aの要素のうち、1番目のものを文字列Kなどとおく

2. 以降、試行回数が奇数の時Kの左端にA[i]を文字列にしたものを加え、偶数の時Kの左端にA[i]を文字列にしたものを加えればよい

あとは、それぞれの文字についてK[i]+" "を別の文字列に足し続け、それを出力すればよいです。

 

さて、解説ですが、以下のようになります。

S,Qを入力する

右端文字列(以降R),左端文字列(以降L)をそれぞれ""で定義。

mode = 0とおきQ回以下のループを行います。

Queryをinput().split()で入力する

(以降Queryのi番目の要素をQuery[i]と置くことにします)

Query[0]が"1"だった場合:

 もしmode = 1ならば mode = 0とし、そうでなければmode = 1とする

else:

 もしQuery[1]が"1"だった場合

  もしmode = 0ならば

   LQuery[2]を挿入

  else:

   RQuery[2]を挿入

 else:

  もしmode = 0ならば

   RQuery[2]を挿入

  else:

   LQuery[2]を挿入

Lは反転しているのでL[::-1]などで反転

mode = 0のときK, mode = 1のときKを反転したものを出力すればよいです。

 

以上、AtCoder Beginner Contest 158の感想&解説 でした。