1435:【例题3】曲线

1435:【例题3】曲线


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 255     通过数: 140 

【题目描述】

明明做作业的时候遇到了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个系数,注意二次函数有可能退化成一次。

【输出】

每组数据一个输出,表示新函数F(x)的在区间[0,1000]上的最小值。精确到小数点后四位,四舍五入。

【输入样例】

2
1
2 0 0
2
2 0 0
2 -4 2

【输出样例】

0.0000
0.5000

【提示】

【数据范围】

T < 10, n ≤ 10000 , 0 ≤ a ≤ 100,|b| ≤ 5000, |c| ≤ 5000

前50%数据n ≤ 100

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
using namespace std;
int T,test,n;
double a[10005],b[10005],c[10005];
double x,maxx=0,L,r,Lmid,rmid;
double cal(double x){
    int i,j;
    double maxx=-0x7fffffff;
    for(i=1;i<=n;i++) maxx=max(maxx,a[i]*x*x+b[i]*x+c[i]);
    return maxx;
} 
int main(){
    int i,j;
    cin>>T;
    for(test=1;test<=T;test++){
        cin>>n;
        for(i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
        L=0;r=1000;
        while(L+1e-11<r){
            Lmid=L+(r-L)/3;
            rmid=r-(r-L)/3;
            if(cal(Lmid)<=cal(rmid)) r=rmid;
            else L=Lmid;
        }
        printf("%.4lf\n",cal(L));
    }
    return 0;
}

 

posted @ 2019-02-21 16:44  YFR718  阅读(860)  评论(0编辑  收藏  举报