NC50178. 曲线
描述
输入描述
输入包含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; }