列表

详情


NC50178. 曲线

描述

明明做作业的时候遇到了n个二次函数,他突发奇想设计了一个新的函数
明明现在想求这个函数在[0,1000]的最小值,要求精确到小数点后四位,四舍五入。

输入描述

输入包含T组数据,每组第一行一个整数n;

接下来n行,每行3个整数a,b,c,用来表示每个二次函数的3个系数。注意:二次函数有可能退化成一次。

输出描述

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

示例1

输入:

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

输出:

0.0000
0.5000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 126ms, 内存消耗: 544K, 提交时间: 2023-02-02 22:12:33

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int T,n;
int a[N],b[N],c[N];

double check(double mid){
    double res=0;
    for(int i=1;i<=n;i++){
        res=max(res,a[i]*mid*mid+b[i]*mid+c[i]);
    }
    return res;
}

int main(){
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i]>>b[i]>>c[i];
        }
        double l=0,r=10001;
        while(l+1e-11<r){
            double lmid=l+(r-l)/3;
            double rmid=r-(r-l)/3;
            if(check(lmid)<=check(rmid)) r=rmid;
            else l=lmid;
        }
        printf("%.4f\n",check(l));
    }
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 84ms, 内存消耗: 744K, 提交时间: 2020-02-13 21:26:30

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
	double a,b,c;
}d[100005];
double check(double x){
	double mx=-10000000;
	for(int i=0;i<n;i++)
		mx=max(mx,d[i].a*x*x+d[i].b*x+d[i].c);
	return mx;
}
int main(){
	int T;
	cin>>T;
	while(T--){
		
		cin>>n;
		for(int i=0;i<n;i++)
			scanf("%lf%lf%lf",&d[i].a,&d[i].b,&d[i].c);
		double l=0,r=1000.0,ll;
		while(r-l>1e-5){
			double m1=l+(r-l)/3.0,m2=r-(r-l)/3.0;
			if(check(m1)<check(m2))
				r=m2,ll=m1;
			else l=m1;
		}
		printf("%.4lf\n",check(ll));
	}
	return 0;
} 

C++(clang++ 11.0.1) 解法, 执行用时: 91ms, 内存消耗: 548K, 提交时间: 2022-08-10 02:20:58

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N];
int t,n;
double cheek(double mid){
	double ret=0;
	for(int i=1;i<=n;i++){
		ret=max(ret,a[i]*mid*mid+b[i]*mid+c[i]);
	}
	return ret;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
		double l=0,r=10001;
		while(l+1e-11<r){
			double lmid=l+(r-l)/3;
			double rmid=r-(r-l)/3;
			if(cheek(lmid)<=cheek(rmid)) r=rmid;
			else l=lmid;
		}
		printf("%.4f\n",cheek(l));
	}
	
	return 0;
}

上一题