ABC158

ABC158に参加しました。

参加して1日2日くらいで記事にするより少し時間空けたほうがいいのかなと思ったらあっという間に1週間弱過ぎていました。

今回は4完できたものの計4回もWAを出してしまって情けなかったです。パフォは緑だったので、WAがなければもっとよかったですね…。

A - Station and Bus

Sが’A'と'B'のどちらかの文字でのみ構成されていた場合に、”No"を、それ以外の場合は”Yes"を出力すればいいです。今回はS.at(0) == S.at(1) && S.at(1) == S.at(2) の時に”No”としました。

Submission #10590444 - AtCoder Beginner Contest 158

 

B - Count Balls

完全に思考がバグってA個とB個を交互に足して、足した回数を数えて答えを出そうとしてWAを出しました。「A個の青とB個の赤を加える」を一つの作業として考え、Nを(A+B)で割り、商をxとして、余りrとAを比べて、答えをA*x + min(A, r)としました。無駄なWAでした。

Submission #10602179 - AtCoder Beginner Contest 158

 

C - Tax Increase

消費税額が100円以下なので税抜き価格はせいぜい1000円くらいだと考え、1円から0.08と0.1をかけていってA円とB円になるかを判定することにしました。1円から一つずつ確かめることで、最小金額のことは考えなくていいです。この時、税抜き価格を1円から1000円までしか調べずにWAを出しました。Bが100の時、税抜き価格は1250円なので(Aが100だとBも100になるので答えは-1になるのですが)調べるべき最大の金額は1009円(1009*0.1 = 100.9で小数点以下切り捨て)になります。コンテスト中はとりあえず2000円まで調べるようにしてし通しましたが、B問題に続けてのケアレスミスで悲しみに包まれていました。

Submission #10608902 - AtCoder Beginner Contest 158

O(1)解法としては

A / 0.08 <= a <= A / 0.08 + A / 0.08 + 12 

B / 0.1 <= b <= A / 0.1 + 9

を満たすa,bに共通する最小の数字nを求める、という感じだと思います。

下のリンクはコンテスト後にACしたものですが、a,bの共通範囲を求める際に下限をmaxで、上限をminでとるようにしました。注意点としては、A,Bをint型で受け取ると切り捨てによって値がぶれてしまうことがあるので(ex A=1)、double型で受け取り、型変換を(APG4bをカンニングしながら)うまく使うことで処理しました(ほかの人から見て賢く使えてるかは不明)。最初int型で受け取ってWAしたのでことごとく詰めが甘いです。

Submission #10814314 - AtCoder Beginner Contest 158

 

D - String Formation

素直にクエリを処理するコードを書いてTLEしたので、反転の回数を管理する変数kと、文字列Sの前につける文字列FR、後ろにつける文字列BAを用意することにしました。Ti=1の操作が二回続いたときはなにも操作していないことと同じになります。また、Sの前後が反転していない状態(kが偶数)で、Fi=1の時はFRに、Fi=2の時はBAに追加し、反転していれば(kが奇数)1の時にBA、2の時にFRに追加することにします。文字の追加は常に最後尾に追加して問題ありません。クエリをすべて処理した後に、kが偶数であればFRを反転させてFR,S,BAの順に、kが奇数であればS,BAを反転させてBA,S,FRの順に出力すればいいです。

Submission #10625347 - AtCoder Beginner Contest 158

 

E,Fもちゃんと解けたら追記したいと思います。

 

時間が少し経つと色々思い出しながらになるので復習として効果的な気はしますが、時間がかかるので大変でした。