GDUT_22级专题一 H - Error Curves

 题目描述

 题目:0d0bf6ba066461dbfdb5a85da17b8a99 (csgrandeur.cn)

题意:给定 n 个二次函数f(x),设F(x)=max{f1​(x),f2​(x),...,fn​(x)},求 F(x) 在区间[0,1000] 上的最小值。

思路:

这道题先输入了一些二次函数,F(x)是每一个点上的最大值,二次函数开口向上,最后形成的F(x)函数图像类似于一个二次函数,所以用三分查找,可以找到F(x)最小的地方。

代码:

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef double db;

db a[10005];
db b[10005];
db c[10005];

int main() {
	std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i]>>b[i]>>c[i];
        }
        db l=0,r=1000,mid1,mid2,jud=1e-11,num1=0,num2=0,tmp;
        while(r-l>jud){
            mid1=l+(r-l)/3;
            mid2=r-(r-l)/3;
            num1=0,num2=0;
            for(int i=1;i<=n;i++){
                tmp=a[i]*mid1*mid1+b[i]*mid1+c[i];
                num1=max(num1,tmp);
            }
            for(int i=1;i<=n;i++){
                tmp=a[i]*mid2*mid2+b[i]*mid2+c[i];
                num2=max(num2,tmp);
            }
            if(num1>num2){
                l=mid1;
            }else{
                r=mid2;
            }
        }
        printf("%.4f\n",num1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值