给你一些函数 y = ax^2 + bx + c,的a >= 0 的二次函数,x的范围是0--1000,
问你在这个范围内函数值最大的最小是多少,最大指的是对于某一个x最大的那个y,最小指的是全体的x范围中最大的那个最小..
思路:
因为a>=0 所以都是开口向上的,如果话F(n) 的 xy( x<= 0 && x <= 1000),图像肯定是单调或者凹性的,所以直接三分就行了..
#include<stdio.h> #include<math.h> #define eps 1e-9 #define N 10000 + 100 typedef struct { double a ,b ,c; }NODE; NODE node[N]; double F(double x ,int n) { double ans = -1000000000; for(int i = 1 ;i <= n ;i ++) { double y = node[i].a * x * x + node[i].b * x + node[i].c; if(ans < y) ans = y; } return ans; } double Search3(int n) { double low ,up ,mid ,mmid; low = 0 ,up = 1000; double dis1 ,dis2; while(1) { mid = (low + up) / 2; mmid = (mid + up) / 2; dis1 = F(mid ,n); dis2 = F(mmid ,n); if(dis1 > dis2) low = mid; else up = mmid; if(up - low < eps) break; } return dis1; } int main () { int t ,n ,i; scanf("%d" ,&t); while(t--) { scanf("%d" ,&n); for(i = 1 ;i <= n ;i ++) scanf("%lf %lf %lf" ,&node[i].a ,&node[i].b ,&node[i].c); printf("%.4lf " ,Search3(n)); } return 0; }