P1883 【模板】三分 | 函数题解

P1883 【模板】三分 | 函数

题目描述

给定 nnn 个二次函数 f1(x),f2(x),…,fn(x)f_1(x),f_2(x),\dots,f_n(x)f1(x),f2(x),,fn(x)(均形如 ax2+bx+cax^2+bx+cax2+bx+c),设 F(x)=max⁡{f1(x),f2(x),...,fn(x)}F(x)=\max\{f_1(x),f_2(x),...,f_n(x)\}F(x)=max{f1(x),f2(x),...,fn(x)},求 F(x)F(x)F(x) 在区间 [0,1000][0,1000][0,1000] 上的最小值。

输入格式

输入第一行为正整数 TTT,表示有 TTT 组数据。

每组数据第一行一个正整数 nnn,接着 nnn 行,每行 333 个整数 a,b,ca,b,ca,b,c,用来表示每个二次函数的 333 个系数,注意二次函数有可能退化成一次。

输出格式

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

输入输出样例 #1

输入 #1

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

输出 #1

0.0000
0.5000

说明/提示

对于 50%50\%50% 的数据,n≤100n\le 100n100

对于 100%100\%100% 的数据,T<10T<10T<10 n≤104\ n\le 10^4 n1040≤a≤1000\le a\le 1000a100∣b∣≤5×103|b| \le 5\times 10^3b5×103∣c∣≤5×103|c| \le 5\times 10^3c5×103

思路

直接三分算法即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long t,n;
long double ep=0.00000000001,a[10004],b[10004],c[10004];
long double abc(long double a1){
    long double b1=-1000000000000.0;
    for(int i=1;i<=n;i++){
        b1=max(b1,a[i]*a1*a1+b[i]*a1+c[i]);
    }
    return b1;
}
int main(){
	cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i]>>b[i]>>c[i];
        }
        long double l=0.000,r=1000.000,op=100000000000000.0;
        while(l+ep<r){
            long double mid=(l+r)/3.000;
            long double mid2=(l*2+r)/3.000,mid3=(l+r*2)/3.000;
            if(abc(mid2)<abc(mid3)){
                r=mid3;
                op=min(op,abc(mid2));
            }
            else{
                l=mid2;
                op=min(op,abc(mid3));
            }
        }
        printf("%.4llf\n",op);
    }
    return 0;
}
posted @ 2025-10-29 21:25  bz02_2023f2  阅读(1)  评论(0)    收藏  举报  来源