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

脳log[20250307]



2025年03月07日 (金) [AtCoder] 精進。前々回の ABC394-F「Alkane」。問題は十分に理解できていたし、E 問題に手が付けられなかった分、E 問題に費やすべき時間も使ってじっくり落ち着いて実装をし、デバッグをしていたのだけど、22時13分の提出 #63052484 が (RE×1/WA×27/AC×31)、22時34分の提出 #63061106 が (WA×28/AC×32) で時間切れになっていた。それから約2週間放置していたのは、自分は何も考え漏らしも勘違いもしていないし、十分に考えを整理してデバッグして書き直しもしたので、あれが間違いならもう何もわからないというのが理由だった。■これが今日の提出 #63061106 (AC)。2週間ぶりに自分の提出を読み直してみたら、13 行目にこんなのがあった。cs.sort_by!(&:size) cs というのは数値配列で、数値を size プロパティに基づいてソートするというのは、ほぼ何もソートしていないのに等しい。だって Bignum でなければ 32 ビット整数なら4、64 ビット整数なら8に決まっているのが数値の size だから。この間違いは過去にもやったことがある。単純に .sort と書くべきところで .sort_by と書いてしまったときに、つい選んでしまって疑問を持ちにくいのが .sort_by(&:size) なのだと思う。しょーもない間違いで貴重な得点を失ったものだ。■解法について書く。テキトーに根を選んで DFS をした。再帰関数の戻り値はアルカンの構成要素になり得る C または H の数。たとえば子がないなら自分自身を H と数えて1を返す。アルカンを構成しうる子が4つ(以上)あるなら、自分自身を C として中心に据えてアルカンを完成させて答えを更新する。アルカンを構成しうる子が1つでもあってそれが単純な H でないなら、自分自身を H として加えてアルカンを完成させて答えを更新する。アルカンを構成しうる子が3つ(以上)あるなら、自分自身を C として中心に据えてアルカンを構成しうる子であるとして親に返す。子が7つも8つもあっても選べるのは最大で4つまでなのだから、できるだけ数が大きい子を選ばないといけない。そのためのソートだったのだけど、ソートできていなかったので WA が出ていた。「アルカンを構成しうる子」というワードについて。実はすべての子がアルカンを構成する(その子を H とみなす)。最初に実装を始めたときには明らかでなかったので思わず条件があるみたいに書いてしまっただけ。