当前位置:编程学习 > C/C++ >>

HDU3714 Error Curves (单峰函数)

大意:
给你n个二次函数Si(x),F(x) = max{Si(x)}
求F(x)在[0,1000]上的最小值。
S(x)=ax^2+bx+c
      (0<=a<=100, |b|,|c|<=5000)
 
简单分析一下可知函数F(x)的图形是下凸函数,可以采用三分法求最值。
 
CODE:
#include <cstdio>  
#include <algorithm>  
using namespace std;  
  
const int maxn = 10000 + 10;  
int n, a[maxn], b[maxn], c[maxn];  
  
double F(double x)  
{  
    double ans = a[0]*x*x + b[0]*x + c[0];  
    for(int i=1; i<n; ++i)  
        ans = max(ans, a[i]*x*x + b[i]*x +c[i]);  
    return ans;  
}  
  
int main()  
{  
    int T;  
    scanf("%d", &T);  
    while(T--)  
    {  
        scanf("%d", &n);  
        for(int i=0; i < n; ++i) scanf("%d%d%d", &a[i], &b[i], &c[i]);  
        double L = 0.0, R = 1000.0;  
        for(int i = 0; i < 100; ++i)  
        {  
            double m1 = L + (R - L)/3;  
            double m2 = R - (R - L)/3;  
            if(F(m1) < F(m2) ) R = m2;  
            else L = m1;  
        }  
        printf("%.4lf\n", F(L));  
    }  
    return 0;  
}  
 
 
求单峰函数的极值也可以用黄金分割法
 
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,