TopCoder SRM 479 (Div 1)
あ、ニコ生オープンの参加記録書いてないや……
今回レート上がったのはいいんだけど内容は微妙。
Result
75.00 / 248.18 / Unopened
1撃墜0ミス
65位
1868->1971
Easy TheCoffeeTimeDivOne
問題
1番からn番まで番号のついた一列に並んだ座席がある。全ての座席には乗客が座っていて、スチュワーデスが全ての客にコーヒーまたはお茶を配る。
お茶を希望する客の座席の番号のリストが与えられ、それ以外の客はコーヒーを希望している。
スチュワーデスは1番の座席の隣にあるサーバーから出発して、飲み物を配る。
スチュワーデスはポットを一つだけ持っており、7人分のコーヒーまたはお茶の一種類だけが入る。
- 隣の座席に移動するのに1秒
- 客に飲み物を注ぐのに4秒
- ポットに飲み物を入れるのに47秒
かかるとき、全ての乗客に希望の飲み物を注ぎ、サーバーまで戻るのにかかる時間を求めよ。
お茶を希望する乗客の数は47人以下であり、
n≦47777777とする。
試行錯誤
250からnがでかいなー。お茶の客が少ないからそこを上手く使うのだろうか。
配り方は遠い客から貪欲に配る方法でよさそうだけど、すげー場合わけめんどくさそう……
あれ、でもこれループ間に合わないか?TopCoderでは5000万は間に合う。
あ、配列もboolならメモリ制限間に合うから、お茶の客も全部配列に入れてしまおう。
んで、7人ずつ配る……
大分方針立てるのに苦戦したけど取り合えず書けた。
最大ケースでも時間が間に合うことを確認して送信。
Medium TheAirTripDivOne
問題開ける前にstandingsを眺める。みんなやっぱり250苦戦してるなー。
問題
1番の都市からn番の都市まで飛行機を乗り継いで行く。
飛行機の便のリストが
A B F T P
のような形式で与えられる。A,Bはそれぞれ出発・到着する都市の番号を表し、Fはその便が最初に出発する時刻を、PはF以降便が出る間隔を、Tは到着までにかかる時間を表す。
(最初の便はFに出発し、F+Pに二番目の便が、以下同様)
飛行機を乗り継ぐには、乗り継ぎ時間があるため、到着時刻をta,そこから搭乗する便の出発時刻をtbとするとtb>taでなければならない。
tb-taをその乗り継ぎの安全度とするとき、使う便全ての安全度の最小値をその旅の安全度とする。
今、ある時間以下でn番の都市に行きたい。このときに可能な安全度の最大値を求めよ。
n≦477,
便のリストは47個以下、
F,T,Pは10億以下である。
試行錯誤
安全度を決めうちした後でダイクストラっぽい感じ?
ある空港Aに一番早い時間で着けば、それ以降の便には全て乗れるので、そのような解のみを考えればいい。だからダイクストラでおk.
で、安全度を二分探索してやれば多分時間も間に合う。
次の便の時間を求めるのに苦戦しつつ、書いた。なんかこう切り上げ書くのが苦手orz
サンプル合わない。
二分法間違えた?いや合ってる。ダイクストラ初期ノード入れてなかったorz
その他数箇所バグを直してサンプル合った!でかいケースも間に合うっぽい。送信。
その後Easy見直し。
うげえええええええコーナーケース間違ってる!!!!!
直したorzリサブミット。。。またかよ。。。酷い。
Medium見直し。
あれ、次の便の時刻の出し方本当にこれであってる?なんかサンプルは通ってるけど。
tmpがpで割り切れる場合・・・間違ってないか!?
やばい時間切れorz
Hard
あけてない
Challenge
Easyミスってる人一人落とした。
コーディング0点なのに5撃墜くらいしてる奴がいて撃墜するものがなくなった。
System Test
あれ?両方通った。