2014年03月16日

AtCoder Beginner Contest #004 に今更挑戦した

AtCoder Beginner Contest #004に、今更ながら挑戦しました。Regular Contestは1問目(頑張っても2問目)で力尽きそうな感じですが、Beginner Contestの方は頑張ればC問題、ちょっち本気出せばD問題もいけるかも? な感じなので、やってて楽しいっす。
で、今回の解答と、考えてたことをとりあえずまとめてみる。もっといい書き方あるはずなので、もちょっと勉強しないと><

ちなみに今回、全部Rubyで解こうと意気込んだのはいいのですが!
途中で心折れて普通にJavaで書いちゃいました……。

ちなみにちゃんと通った解答はこちら。(ABC
ではでは、この後は「Dahlia*が脳内で何を考えていたのか」を振り返っていきますです。

A - 流行
〜???「倍返しだ!」 Dahlia*「いや、ホワイトデーは3倍返しっしょ、常考」〜



いや、サブタイトルは冗談ですからね? チロルチョコでもお返しがもらえたらうれしいですよ?

思った通りに書きました、が。

今回初めてRubyでキーボードからの入力を受け付ける方法を知りました、一つ賢くなりました(`・ω・´)

B - 回転



こっからJavaで書いてます。半月ぶりくらいにJava書きましたが、意外と覚えてるモノですね。細かい部分は忘れてましたが、ドキュメント読んだり参考書漁ったりしてなんとかしました。

最初に思いついたのは「二次元配列に要素をたたき込む」→「後ろから呼び出す」だったのですが。
改行の扱いがどうなるか知らんかったとか、先にこっちを思いついちゃったとか、いろいろありまして、結果「一行ごとに読み込む」→「後ろから呼び出せるようにfor文書く」になっちゃいました。そしたらfor文祭りになっちゃいました。かっこわるいですね。
もっとかっこよく書くには、配列を使いこなさないといけない気がしてきました。気のせいかな。

C - 入れ替え
〜例示は理解のなんとやら〜



例示は理解の試金石、いやぁ、本当ですねぇ。実際に試して観察してみたら、意外といい方法が見つかりましたです。
まず、どこを並び替えるか、と言う話。最初は問題通り実装したつもりだったのですが、なんか上手くいかなくて。
ごにょごにょ書き換えてたら、案の定(!)自分の勘違いでした。これはひどい。

ここで喜んで提出しようと思って、一番最後の例を試してみたらちょっとやばいことに気がつきました。
あれくらいの大きさの数字がやってきたら、制限時間(2秒)に間に合わない。
ここで一度出かけて、帰ってきた後に提出してみたのですが、やっぱりめっちゃ時間掛かってました;;
なので、ひとつ実験を。
さっきのコードを少し改造しまして。

するとーこんな結果が!

Nが100のときまで、並び替えをざざざざーーーーーっと書き出してみました。
よくよく観察すると30の倍数のところで元の並び(123456)に戻ってますね!(iは0からカウントなので、正確には29とか、89とかのところですが)
なんてこった!!
と、いうことで、30で割って、そのあまりの回数だけ並び替えればいいということがこれで発覚しました。わぁい楽ちん。

で、結果こうなる。


まとめ


もっと勉強しよう!
タグ:ruby JAVA
posted by Dahlia* at 23:20| Comment(0) | 競技プログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: