大意: 給你n個二次函數Si(x),F(x) = max{Si(x)} 求F(x)在[0,1000]上的最小值。 S(x)=ax^2+bx+c (0<=a<=100, |b|,|c|<=5000) 簡單分析一下可知函數F(x)的圖形是下凸函數,可以采用三分法求最值。 CODE: #include <cstdio> #include <algorithm> using namespace std; const int maxn = 10000 + 10; int n, a[maxn], b[maxn], c[maxn]; double F(double x) { double ans = a[0]*x*x + b[0]*x + c[0]; for(int i=1; i<n; ++i) ans = max(ans, a[i]*x*x + b[i]*x +c[i]); return ans; } int main() { int T; 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.0, R = 1000.0; for(int i = 0; i < 100; ++i) { double m1 = L + (R - L)/3; double m2 = R - (R - L)/3; if(F(m1) < F(m2) ) R = m2; else L = m1; } printf("%.4lf\n", F(L)); } return 0; } 求單峰函數的極值也可以用黃金分割法