明明做作业的时候遇到了n个二次函数Si(x)= ax2 + bx + c,他突发奇想设计了一个新的函数F(x) = max(Si(x)), i = 1...n.
明明现在想求这个函数在[0,1000]的最小值,要求精确到小数点后四位四舍五入。
输入
输入包含T 组数据 (T < 10) ,每组第一行一个整数 n(n ≤ 10000) ,之后n行,每行3个整数a (0 ≤ a ≤ 100), b (|b| ≤ 5000), c (|c| ≤ 5000) ,用来表示每个二次函数的3个系数,注意二次函数有可能退化成一次。
T < 10, n ≤ 10000 , 0 ≤ a ≤ 100,|b| ≤ 5000, |c| ≤ 5000
输出
每组数据一个输出,表示新函数F(x)的在区间[0,1000]上的最小值。精确到小数点后四位,四舍五入。
样例输入
样例输出
解题思路:最大值的最小 三分裸体

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int t,n; 5 double a,b,c; 6 double arr[10005],brr[10005],crr[10005]; 7 8 double solve(double x){ 9 double minn=arr[1]*x*x+brr[1]*x+crr[1]; 10 for(int i=2;i<=n;i++){ 11 minn=max(minn,arr[i]*x*x+brr[i]*x+crr[i]); 12 } 13 return minn; 14 } 15 16 double calculation(double left,double right){ 17 double eps=1e-9; 18 while(left+eps<right){ 19 double midleft=left+(right-left)/3.0; 20 double midright=right-(right-left)/3.0; 21 if(solve(midleft)<=solve(midright)){ 22 right=midright; 23 } 24 else left=midleft; 25 }/// 26 // printf("%.4f ",left); 27 return solve(left); 28 } 29 30 int main(){ 31 // ios::sync_with_stdio(false); 32 cin>>t; 33 while(t--){ 34 cin>>n; 35 for(int i=1;i<=n;i++) cin>>arr[i]>>brr[i]>>crr[i]; 36 printf("%.4f ",calculation(0.0,1000.0)); 37 } 38 return 0; 39 }