ABC162

参加しました。

Cも解けなくて泣きそうです。

 

All Submissions - AtCoder Beginner Contest 162

 

A-Lucky 7

10で三回割って、毎回の余りが7かどうかをチェックしました。

ジャッジシステムのアップデートを忘れていて、しっかりCで提出してCEをもらいました。

 

B-FizzBuzz Sum

3か5で割り切れたらcontinueして配列aをすべて足しました。

ここまでは10分でかなり良かったんですが…。

 

C-Sum of gcd of Tuples(Easy)

三重のfor文ですべて試すことにしました。a,bの最小公倍数を求め、それとcの最小公倍数を出せばいいからです。最小公倍数はユークリッドの互除法を用いて、再帰関数で実装しようとしました。

自分でも信じられないのですが、再帰関数をバグらせた理由が、再帰呼び出しのところでreturnを前につけていなかったからでした。Dで手間取ったのでCのバグ取りに時間はあまり割いていませんでしたが、いくらなんでもひどすぎます。今日解きなおして自分に絶望しました。悲しいです。

 

D-RGB Triplets

とりあえず三重for文でやってみました。絶対TLEするだろうと思ったのですが、運良く通れば儲けものと思って出してみました(もちろんTLE)。

そこで、Sの各位置において、R,G,Bのそれぞれがそこよりも右側にいくつあるかを数えておき、i,jの二つの位置を決めて、それよりも後ろで最初に三種類目の文字が出てくるところを探しました。そこにカウントされている数に、もし等間隔になっているものがあれば1を引くようにしました。コンテスト中にどうしてもサンプルが通せなかったのですが、これも今日よく考えたところ、等間隔の位置を比較しようとしてi,j,j+iを添え字にしていました。i,j,j+j-iじゃないといけないですよね…。自分のことが信じられません(二回目)。さらに添え字を修正しても一つTLEが出ました。これも当たり前と言えば当たり前で、例えばn=4000として、Rが4000個並んでいればTLEになります。自分の愚かさにうんざりしそうです。

というわけで、解説ACしました。そもそもi<j<kということで一つずつ検討するものだと決めてかかっていましたが、組み合わせで考えればいいですね。なんとなくRがi、Gがj、Bがk、という風に内心で変換していました。こういうのはよくないですね。全体の数が分かっていれば、最初の二つの位置を決めればO(1)で等間隔になっているかどうかは判定できるのでとてもスマートです。

 

E,Fは少し頭を冷やしてから再チャレンジしようと思います。

 

ここひと月ほど不本意な結果だ、俺はもっとできるんだ、という気持ちばかりがあったせいで今まで以上に初歩的なミスをしてしまったのかなあと思います。思い上がりも甚だしいという感じです。

とはいえ、余りネガティブになっても仕方がないので、切り替えてまた勉強していきたいです。