[日常训练]curves

Description

Y同学的弟弟小Z昨天学习了数学中的一元二次函数,但是由于学业不精,他一个晚上都在缠着小Y问一元二次函数的极值问题,小Y烦不可耐,于是,想请你帮忙弄个程序来应付小Z。程序要完成以下任务:

给你N个二次函数,记第i个为:f_i(x)=a_ix^2+b_ix+c_i

设函数F(x)=max\{f_1(x),f_2(x)...f_n(x)\}

请你求出F(x)的在区间[0,1000]上的最小值,结果保留3位有效数字。

Input

输入文件第一行是一个整数N
接下来N行,每行3个实数a_i,b_i,c_i,之间有一个空格分隔。

Output

输出一行一个实数,表示F(x)的在区间[0,1000]上的最小值。

Sample Input

2
3 ­-2 1
2 -4 2

Sample Output

0.686

HINT

1$\leq$N$\leq$100000,0$\leq$a_i$\leq$100,|b_i|$\leq$5000,|c_i|$\leq$5000

Solution

本题二分ans三分都可过.

二分答案,判断f_i(x)$\leq$ans的定义域的交与[0,1000]是否有交集.

画图可知,F(x)为单峰函数.三分x值,判F(x).

注意精度.

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define eps 1e-10
#define M 1000
#define N 100005
using namespace std;
struct func{
    double a,b,c;
}a[N];
int n;
double l=0.0,r=1000.0,m1,m2;
inline double f(double x){
    double ret=a[1].a*x*x+a[1].b*x+a[1].c;
    for(int i=2;i<=n;++i)
        ret=max(ret,a[i].a*x*x+a[i].b*x+a[i].c);
    return ret;
}
inline void init(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%lf%lf%lf",&a[i].a,&a[i].b,&a[i].c);
    while(l+eps<r){
        m1=(r-l)/3.0;m2=l+m1*2.0;m1+=l;
        if(f(m1)>f(m2)) l=m1+eps;
        else r=m2;
    }
    printf("%.3lf\n",f(l));
}
int main(){
    freopen("curves.in","r",stdin);
    freopen("curves.out","w",stdout);
    init();
    fclose(stdin);
    fclose(stdout);
    return 0;
}

转载于:https://www.cnblogs.com/AireenYe/p/6049222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值