ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AGC029 B - Powers of two

問題
提出コード

解法

実は貪欲法です。
大きい数字から、ペアを決めていきます。
ペアのうち大きい数字をxとし、もう片方をyとします。すると、xyで作ることができる2べきの数は、1種類しか存在しません。
xより大きい2べきの数のうち最小のものをzとすると、x \geqq z-xですが(式変形すると x \geqq z/2 となります、設定した条件を満たしています)、zの次に小さい2べきの数は2zであるため、x \lt 2z - xとなってしまいます(式変形するとx \lt z となります、こちらも設定した条件通りです)。

よって、1種類しか存在しないのなら、そのペアは真っ先に選択すべきです。
これは以下のようにして背理法によって証明されます(間違っていたらごめんなさい)。
今、x,yの和が2べきになるとします。x \geqq yです。
そして、x以下の数字のみが存在する集合Sが存在して、 \{x,y,S \}の中でのペアの最大数を考えることにします。
Sの中で作れるペアの最大数をkとすると、(x,y)をペアとした時は、k+1が答えとなります。
さて、ここで(x,y)のペアを選ばない方が全体の最大数が多くなると仮定します。すると、xy以外でペアを作れる数字が存在しない(厳密にはSの元としてyがある可能性がありますが、状況は今のまま変わらないため除外します)ので、\{y,S \}の中で2べきのペアの個数がk+2以上となることになります。
こうなるためには、Sの中で、少なくともペアの個数がk+1になっていなければなりません。なぜならば、yとのペアを1つ作成しても個数はもちろん1つにしかならないので、k+2となるには、残りのk+1つのペアをSでカバーしきらなければならないからです。
これは、Sのペアの最大数がkであることと矛盾します。
ということは、そもそも(x,y)のペアを選ばない方が全体の最大数が多くなるという仮定が間違っていたことになるので、(x,y)を選んだ場合の、k+1個が答えの最大値となります。
というわけで、結局数列Aを降順でソートし、大きい数字から順番に、2べきをつくれるような相方が存在すればペアを作り…ということを繰り返していけば、最終的なペアの個数が求まります。