奥赛一本通 1435 曲线

1435 曲线

题目大意

给定 $n$ 个开口向上的二次函数,将它们的最大值定义为新函数,求这个函数在区间上的最小值。

知识要点

二次函数、三分

解题思路

新函数必然是先递减后递增的结构,利用三分去除两侧函数值较大的那一段。

参考代码

#include <bits/stdc++.h>
using namespace std;

const int N = 10005;
int t, n, a[N], b[N], c[N];
double func(double x) {
    double ans = -1e9, res;
    for(int i = 0; i < n; i++) {
        res = a[i] * x * x + b[i] * x + c[i];
        ans = max(ans, res);
    }
    return ans;
}
int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        for(int i = 0; i < n; i++) scanf("%d%d%d", &a[i], &b[i], &c[i]);

        double l = 0, r = 1000, m1, m2;
        while(r - l > 1e-9) {
            m1 = l + (r - l) / 3, m2 = r - (r - l) / 3;
            if(func(m1) < func(m2)) r = m2;
            else l = m1;
        }
        printf("%.4lf\n", func(l));
    }
    return 0;
}
posted @ 2026-09-07 16:42  萧西待水  阅读(4)  评论(0)    收藏  举报