程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU3714 Error Curves (單峰函數)

HDU3714 Error Curves (單峰函數)

編輯:C++入門知識

大意: 給你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;   }       求單峰函數的極值也可以用黃金分割法    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved