/ 最近 .rdf 追記 編集 設定 本棚

脳log[20221022]



2022年10月22日 (土) [AtCoder] 精進1。今日あったキーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274)-F「Fishing」(黄 diff)。解答の方針はすぐにわかった。幅 A の区間で魚を捕るときに中途半端な範囲を選ぶ理由がないので、ある魚が x にいるタイミングで x+A までの範囲で魚を捕る。ある魚と他の魚の関係は、(初期位置の前後)×(速度差)=(追いつく、追いつかれる、逃げられる、逃げ切る)の4通り。魚ごとにタイムラインを再生して区間内にいる他の魚を管理する。■提出 #35895537 (WA×8)。時間内の提出はこれ。WA の原因は3つ(!)あって、1つは 21 行目 t = (A+dx).fdiv dv。これは「追いつく」関係のときに追い越してしまって幅 A の区間から出てしまうタイミングを計算する式。正しくは t = dx.fdiv dv。2つめは 11 行目と 19 行目 でハッシュのキーに 0 を使っているところ。0 と 0.0 をソートしたら結果が不定になった(Ruby 2.7 の場合)。それではハッシュを入る方と出る方の2つに分けた甲斐がない。実数で閉区間は扱いにくいんよ(どうして区間を x+A 未満にしてくれなかったのか)。キーが 0 であれ 0.0 であれ入る方を必ず先に加算しなければいけないのにできていなかった。3つめは「追いつかれる」ケースの処理を忘れていたこと。■提出 #35903826 (AC / 712 Byte / 2942 ms)。これだけミスがあって時間もかかるなら解けた喜びしかない。なんにも惜しくない。■■■精進2。同じ ABC174-E 問題「Booster」(水 diff)。時間中は F 問題にかかりきりで読まなかった。ブースターを使う使わないを総当たりしてダイクストラ法かなと考えたりもしたけど、どうにもはまらない。むしろ巡回セールスマン問題(TSP)だった。■提出 #35902406 (AC / 674 Byte / 1847 ms)。これまで2問くらい TSP(roblem) を解いてるけど久しぶりすぎて忘れていた。ワーシャルフロイド法と同じ見た目をしていることを思い出すのに時間がかかり、何とか書き上げても TLE を2回食らった。以前にタイムを詰めに詰めてこれが決定版と言えるものを作ったんだけど、内容を覚えていないしどの問題かも思い出せなかった(そのときに競ってアイデアを提供してくれたアカウントは覚えている。精進中に見かけた名前を最近またコンテストで見るのは嬉しいものだけど、逆もあって寂しい)。唯一思い出したのが 12 行目の 1,0 = (N+M).times.partition{|b| 0<vs[b] }。これで TLE が解消した。