奥赛一本通 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;
}

浙公网安备 33010602011771号