AGC最初の最初で詰まると哀しいよね。人から銅のコインを全て貰うことができる。同じ人から2種類以上のコインを貰うことはできない。このとき、あなたが貰えるコインの枚数の最大値を求めよ。銅は無視して金と銀についてだけ考えることにする。あと冗長なので金のコインを貰う人のことを「金の人」と呼ぶことにする。人々を(金の枚数)-(銀の枚数)で昇順にソートして左から並べる。人がいるわけだが、実は最適解における金の人はすべての銀の人より右側にいることが分かる。これは背理法で示すことができる。仮に金の人の右に銀の人がいると仮定しよう。このとき、この2人から貰うコインの種類を交換することで、先程のソートの前提から貰える総コインはより多くなる。元金の人から銀コインを貰うことによる損を、元銀の人から金コインを貰うことによる得が上回るのだ。ここまで来たらゴールは近い。人の2グループに分ける。人を銅の人に分けるような最適解が存在する。各グループにおける割り振りはどうすればいいかというと、先と同じように(金/銀の枚数)-(銅の枚数)でソートしてやればいい。この辺はグループの人数を増やしながらpriority_queueを使えばできる。ついて求めれば、その最大値が答えとなる。類題の話この問題を解いてる途中「なんか似たような問題なかったっけ?」と思い、過去問を漁ったら下位問題に相当するものがあった。Numbers」(500)である。最初の「金の人と銀の人が交わらない」ということに気づくと、後は実装の手間が加わっただけのほぼ同型問題になってしまう。これを解いた経験もあって、大枠の実装自体は比較的スムーズに進んだ(細かい部分で相当つまづいたが)。いうところでも精進の成果が現れるものだ。最初の一歩はどうやったら踏み出せるようになるんだろうか。それ以降は自力でできたのは良かった。変数名にセンスのNASAが露呈している。手間を惜しまず実装の情報を紙に書こう。解説ABC106の解説。A~Cは穏やか、D難しめ。前編(A-C)久しぶりの解説記事。公式はてなブログをはじめよう!misteerさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。