zoukankan      html  css  js  c++  java
  • uva 1476 Error Curves 题解

    题意:给n个二次函数f(x),定义F(x)=max(f(x)),即n个二次函数中的最大值。求F(x)在区间[1,1000]内的最小值。

    根据题意可以知道,F(x)是单峰函数。于是我们可以三分解决。对于区间[L,R],找它的三等分点M1,M2,如果F(M1)<F(M2),则答案在[L,M2],否则在[M1,R]。

    精度最好高一点。。只差一两个数量级是不行的,因为有函数会放大误差。。

     1 #include<cstdio>
     2 #include<algorithm>
     3 const int MAXN=10000+5;
     4 int n;
     5 int a[MAXN],b[MAXN],c[MAXN];
     6 inline double f(int i,double x)
     7 {
     8     return a[i]*x*x+b[i]*x+c[i];
     9 }
    10 inline double F(double x)
    11 {
    12     double ans=f(0,x);
    13     for(int i=1;i<n;++i)
    14         ans=std::max(ans,f(i,x));
    15     return ans;
    16 }
    17 int T;
    18 int main()
    19 {
    20 //    freopen("1.in","r",stdin);
    21     scanf("%d",&T);
    22     while(T--)
    23     {
    24         scanf("%d",&n);
    25         for(int i=0;i<n;++i) scanf("%d%d%d",a+i,b+i,c+i);
    26         double L=0.0,R=1000.0;
    27         while(R-L>1e-9)
    28         {
    29             double M1=L+(R-L)/3,M2=R-(R-L)/3;
    30             if(F(M1)>F(M2)) L=M1;
    31             else R=M2;
    32         }
    33         printf("%.4f\n",F(L));
    34     }
    35     return 0;
    36 }
  • 相关阅读:
    模拟实现链表
    模拟实现内存操作函数
    实现一个简单的进度条
    简单的通讯录(C语言实现)
    sizeof和strlen
    动态联编
    不用第三个变量交换两个变量的值
    内存对齐
    字符串指针和字符数组的区别
    vs中的一些bug解决
  • 原文地址:https://www.cnblogs.com/lowsfish/p/4307193.html
Copyright © 2011-2022 走看看