AtCoder Regular Contest 054 B : ムーアの法則

arc054.contest.atcoder.jp

解法までの道のり

  • 二分探索? → 普通に違う → やざてんさんより二分探索で解けるとご指摘いただきました! ページ下部で補足します。
  • 3 が入力されるケースで、1e-9刻みでやってみると、下に凸な関数であることが分かる

解法

微分して、0になるxを紙で書いて見つけてポイ

x = \frac{3 \log(p \frac{\log 2}{ 1.5})}{\log 4}

f(x) = x + \frac{p}{ 2^{\frac{x}{1.5}} }

Submission #937510 - AtCoder Regular Contest 054 | AtCoder

下手に回り道して無限に時間がかかった・・・。
あと、log_2 とlog_10 と log_e がごっちゃになってつらかった。

補足

解説を見たら、3分探索というのでも解けるらしい。
凸関数の極値を求めるのに使うそうだ。

d.hatena.ne.jp

調べたら、黄金分割探索、というのがより効率的で良いとのこと。
ライブラリ化しよう。

その際に参考にしたページ:
qiita.com


Submission #937637 - AtCoder Regular Contest 054 | AtCoder

ちょっと、

Comparator.comparingDouble(Double::doubleValue).reversed()

このDouble::doubleValueというのが汚い。いい方法ないかな。

さらに補足

やざてんさんよりコメントで、二分探索でも解けるとのこと。

f:id:arukuka:20161022122044p:plain

midが負だったら、left=mid、正だったらright=midとして、
微分した関数f'(x)=0となるxを探索する。

数値解析では二分法と呼ばれているものですね。
ここをニュートン法とかでやってみてもおもしろいかも。

Submission #937657 - AtCoder Regular Contest 054 | AtCoder

ご指摘ありがとうございます。

そのままだったら三分探索、微分したら二分探索、
式をいじったらO(1)っておもしろい。