ACM/ICPC国際プログラミングコンテスト2012

Team Akensho で出場しました。
なぜか(?)僕のアカウント名で登録されてしまいました。悲しみ。


メンバは
B4 僕
B4 研究室のお友達
M1 先輩
でした。この中ではM1の先輩が一番強いです。
言語はJavaで参戦しました。

チーム結成から前日まで

みんなの予定が合わず、なかなか練習できない日が続きました。
とはいえ、なんだかんだでそこそこ(例年より多めに)問題演習できました。

チームの作戦としては、B4の二人がA問題とB問題を説いている間に、M1の先輩がC問題に手をつけ、D問題は3人で力をあわせて解く。ということを妄想してました。

当日〜本番直前まで

12:50に大学からの最寄り駅で友達と待ち合わせ(彼もB4ですが、違うチーム)。
そのまま彼の車で買い出しに出る(新車買いやがってムカつく!)

13:30に大学到着。大量のお菓子と水分を提供する(先輩方ありがとうございました)

14:00 本番用のMBPにeclipse導入するも、最新ヴァージョン(Juno)を落としてしまい、UIの微妙な変化に戸惑う。コンソールどこやねん!

15:00 無事にプラクティスを終了させる。このへんからM1の先輩が睡眠し始める。

16:00 先輩、起きる。

16:15 めっちゃ緊張しはじめる && チョコレートを過剰摂取して鼻血がでそうになる。

16:30 スタート

本番

問題文はこちら

A

A問題をB4の二人で解きにかかります。
この時点で僕は足元ガクガク、タイピングまともにできないくらい緊張してましたが、問題をゆっくり読んで、入力をとったあたりから落ち着きました。
あれ?この問題、進研ゼミでやった問題?類題を解いた気がするぞ...
WUPC 2012 A 招待状
AtCoder Regular Contest #002 A うるう年
このへんかな?

だいたい30分くらいでACできました。

B

データ構造はHashMapを使いました。
変換(?)するときのロジックは以下の通り。

1.a0を文字列で取得する。
2.桁数=文字列長はlength()使えば取得できるので、指定された桁数に満たない場合はその分だけ"0"をくっつける。
3.a0をcharの配列に変換してソートする。これで 001122 って感じになる。そしてa0をchar配列から文字列へ変換。
4.001122 を反転させると 221100 となるので、a0をStringBufferに喰わせてreverse()で反転。そしてまた文字列に戻す。

こんな感じでMapに格納していって、containsとかで衝突判定しました。

残念ながら提出したソースコードが先輩のMBPにおいたままなので、確認とれませんが...

実はこの問題は先輩が半分くらい実装したので、あまり貢献できなかった。
僕は変換するロジック書いたくらいです。

だいたい1時間くらいでACしました。この時点で残り2時間。

C

なんじゃこりゃ...
僕らがBを組んでいるときに、先輩にある程度方針を立ててもらいました。

が、

6と4が見えているときに、残りの面が2なのか5なのかがわかんない。

仕方がないので、手元のサイコロ見ながら決め打ちしました。

int getDice(int top, int front){
    int res = -1;
    if(top == 6 && front == 4)res = 5;
    .
    .
    .
    return res;
}

こんな感じでしょうかね。

このような場合分けとか、回転処理のロジックを考えている間に先輩がコーディング。

しかし、時間がかかり、バグに苦しみ、結果、時間切れ。

D

これはDijkstraで終わりっぽい?
でもコストのとり方どーしよ...げ、入力イミフ。
Cの方が実装すれば解けそうなのでCを優先しよう!→ということで、スルー

結果

非公式ながらここに。85thでした。

感想

アジア予選に出場できなかったばかりか、去年よりも成績が落ちてしまった。
しかも大学内順位も2位でした(車をだしてくれた彼のチームが3ACしたので)。

特に、今回はM1の先輩が参加できる最後の大会だったので、アジア行きたかったです...

「1時間でAとBを通す」という目標がほぼ達成できたのは良いことですが、Cでここまではまるとは思ってもなかったです。

来年は僕が参加できる最後の大会なのですが、(この頃の競技プログラマのレベルがドラゴンボールのようにインフレしているので)何か特別な特訓でもしないといけないかなあ、とも思いました。
単純に努力が足りてないという話もありますので、できるだけ精進していきたいです。