Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2011-10-01

C

02:19 | C - kojingharangの日記 を含むブックマーク はてなブックマーク - C - kojingharangの日記 C - kojingharangの日記 のブックマークコメント

ふつうにやると large の計算が終わらないので、なんか法則性があってO(N)にならないような方法があるんだろう

→とりあえずビットが全部たってる2**n-1とそれ以外で分けたらいいんじゃね?......という予想をしつつも証明できないのでまずはsmallをふつうにやる。

smallが通ったら、N以下の最大の2**n-1と残りでわけたときの合計ビット数を求めてみて、通った答えと一致してることを確認

→でdiffしたらおなじだったのでそれでlarge提出。なんとも危なっかしいやり方だけどまあいいや(笑)

証明は「2**n-1で分けるのが最適でない場合、ビットが全部立ってるとこから残りの方に移すとビットがもっと増えるはずだがそうはならない」みたいな感じでできそう。

立ってるビットを減らして他方にもってきたときに他方で2以上増えないといけないけど、0だったとこにもってきても1になるだけで合計は変わらないし、1だったとこにもってくると0になって良くて繰り上がって1になっても変わらないし繰り上がり方によってはどんどん減る方向にしかいかないので当初の分け方が最大。みたいな感じでしょうか。

 |