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
これは簡単です。についてリストに入れて、あとはset→list化しその要素数で
判定すればよいです。(要素1なら"No",要素数2なら"Yes")
B問題
https://atcoder.jp/contests/abc158/tasks/abc158_b
というのを見てループではないと確信。いやしかし判定方法の考察に時間がかかってしまったorz
条件分岐:
] : を出力
] : を出力
]それ以外
もし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 から適当な数 くらいまでのループを作成)
Pythonならばmath.floor()という関数があり、それで,を小数点以下切り捨てした値がそれぞれに等しければループを終了します。そして、そこで
を出力すればよいです。
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]+" "を別の文字列に足し続け、それを出力すればよいです。
さて、解説ですが、以下のようになります。
を入力する
右端文字列(以降),左端文字列(以降)をそれぞれ""で定義。
mode = 0とおき回以下のループを行います。
をinput().split()で入力する
(以降のi番目の要素を]と置くことにします)
]が"1"だった場合:
もしmode = 1ならば mode = 0とし、そうでなければmode = 1とする
else:
もし]が"1"だった場合
もしmode = 0ならば
に]を挿入
else:
に]を挿入
else:
もしmode = 0ならば
に]を挿入
else:
に]を挿入
は反転しているのでL[::-1]などで反転
mode = 0のときK, mode = 1のときKを反転したものを出力すればよいです。
以上、AtCoder Beginner Contest 158の感想&解説 でした。