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