HDU 3714 Error Curves(三分)
2017-07-17 20:12
330 查看
Description
给出n个二次函数
定义
问f(x)在[0,1000]的最小值
Input
第一行一整数T表示用例组数,每组用例首先输入一整数n表示二次函数数量,之后n行每行输入三个系数a[i],b[i],c[i] (T < 100,n<=10000,0<=a<=100,|b|,|c|<=5000)
Output
对于每组用例,输出f(x)的最小值,结果保留四位小数
Sample Input
2
1
2 0 0
2
2 0 0
2 -4 2
Sample Output
0.0000
0.5000
Solution
凸函数的最大值还是凸函数,三分求f最小值即可
Code
给出n个二次函数
定义
问f(x)在[0,1000]的最小值
Input
第一行一整数T表示用例组数,每组用例首先输入一整数n表示二次函数数量,之后n行每行输入三个系数a[i],b[i],c[i] (T < 100,n<=10000,0<=a<=100,|b|,|c|<=5000)
Output
对于每组用例,输出f(x)的最小值,结果保留四位小数
Sample Input
2
1
2 0 0
2
2 0 0
2 -4 2
Sample Output
0.0000
0.5000
Solution
凸函数的最大值还是凸函数,三分求f最小值即可
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 11111 int T,n,a[maxn],b[maxn],c[maxn]; double f(double x) { double ans=1.0*a[1]*x*x+1.0*b[1]*x+1.0*c[1]; for(int i=2;i<=n;i++) { double temp=1.0*a[i]*x*x+1.0*b[i]*x+1.0*c[i]; ans=max(ans,temp); } return ans; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]); double l=0,r=1000,mid1,mid2,f1,f2; int t=100; while(t--) { mid1=0.5*(l+r); mid2=0.5*(mid1+r); f1=f(mid1),f2=f(mid2); if(f1>=f2)l=mid1; else r=mid2; } printf("%.4f\n",f1); } return 0; }
相关文章推荐
- nyoj 1029/hdu 3714 Error Curves 三分
- hdu 3714 Error Curves(三分)
- HDU 3714 Error Curves(三分)
- HDU 3714 Error Curves(三分+模拟)
- hdu 3714 Error Curves(三分)
- LA 5009 (HDU 3714) Error Curves (三分)
- HDU 3714 Error Curves【三分查找】【经典题】
- hdu 3714 Error Curves(三分)
- HDU 3714 - Error Curves (三分查找)
- hdu 3714 Error Curves (三分)
- HDU3714——三分——Error Curves
- HDU 3714 Error Curves 简单三分
- HDU 3714 Error Curves(三分查找)
- hdu 3714 Error Curves(三分)
- HDU 3714 Error Curves(三分)
- 数学-三分->HDU 3714 Error Curves
- nyoj 1029/hdu 3714 Error Curves 三分
- POJ 3714 Error Curves(三分)
- HDU 3714 Error Curves(3分)
- HDU 3714 Error Curves(模拟退火刷时间)