求单峰函数的最值点

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 15;
    4. const double eps = 1e-12;
    5. int n;
    6. double a[N];
    7. double cal(double x) {
    8. double pow = 1, res = 0;
    9. for (int i = n+1; i >= 1; i--) {
    10. res += a[i]*pow;
    11. pow *= x;
    12. }
    13. return res;
    14. }
    15. signed main() {
    16. double l, r;
    17. cin >> n >> l >> r;
    18. for (int i = 1; i <= n+1; i++)
    19. scanf("%lf", &a[i]);
    20. while (r-l >= eps) {
    21. double m1 = l+(r-l)/3;
    22. double m2 = r-(r-l)/3;
    23. //此处求的是最大值,最小值改为<=即可
    24. if (cal(m2)-cal(m1) >= eps) {
    25. l = m1;
    26. } else {
    27. r = m2;
    28. }
    29. }
    30. printf("%.5lf\n", l);
    31. return 0;
    32. }