曲线(三分)

明明做作业的时候遇到了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\n",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\n",calculation(0.0,1000.0));
37     }
38     return 0;
39 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/11255712.html