TechFUL: Extreme Happy!
問題概要
関数 が以下のように定義される.
が最小となる の値を小数点第 5 位を四捨五入して出力せよ.
但し、最小値となる はただ一つであり、0 より大きく 100 未満の値をとることが保証されている.
制約
は実数.
はネイピア数 を底とする自然対数である.
考えたこと
を微分すると となる.
が最小となる の値を とする.
条件から恐らく は下に凸で、 が成り立つと考えられる.
の値は二分法で求めることができる.
二分法の解説:二分法とは? アルゴリズム・収束・例題 - 理数アラカルト -
#include <bits/stdc++.h> using namespace std; double round_n(double data, long long n) { double ret = data * pow(10.0, n); ret = (double) (long long) (ret + 0.5); return ret * pow(10.0, -n); } const double EPS = 1e-10; double a, b, c; double ff(double x) { return 2 * a * pow(x, 1 + log(x)) * (1 + log(x)) + b; } int main() { cout << fixed << setprecision(4); cin >> a >> b >> c; double lb = 0.0, ub = 100.0; for (int i = 0; i < 100; ++i) { double m = (lb + ub) / 2.0; if (ff(m) < -EPS) lb = m; else ub = m; } cout << round_n(lb, 4) << endl; }