AtCoder Regular Contest 054 B : ムーアの法則
解法までの道のり
- 二分探索? → 普通に違う → やざてんさんより二分探索で解けるとご指摘いただきました! ページ下部で補足します。
- 3 が入力されるケースで、1e-9刻みでやってみると、下に凸な関数であることが分かる
- 最急降下法で実装 → 全然ダメ
- 諦めて微分する
解法
微分して、0になるxを紙で書いて見つけてポイ
Submission #937510 - AtCoder Regular Contest 054 | AtCoder
下手に回り道して無限に時間がかかった・・・。
あと、log_2 とlog_10 と log_e がごっちゃになってつらかった。
補足
解説を見たら、3分探索というのでも解けるらしい。
凸関数の極値を求めるのに使うそうだ。
調べたら、黄金分割探索、というのがより効率的で良いとのこと。
ライブラリ化しよう。
その際に参考にしたページ:
qiita.com
Submission #937637 - AtCoder Regular Contest 054 | AtCoder
ちょっと、
Comparator.comparingDouble(Double::doubleValue).reversed()
このDouble::doubleValueというのが汚い。いい方法ないかな。
さらに補足
やざてんさんよりコメントで、二分探索でも解けるとのこと。
midが負だったら、left=mid、正だったらright=midとして、
微分した関数f'(x)=0となるxを探索する。
数値解析では二分法と呼ばれているものですね。
ここをニュートン法とかでやってみてもおもしろいかも。
Submission #937657 - AtCoder Regular Contest 054 | AtCoder
ご指摘ありがとうございます。
そのままだったら三分探索、微分したら二分探索、
式をいじったらO(1)っておもしろい。