UVA - 1476 - Error Curves

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA - 1476 - Error Curves相关的知识,希望对你有一定的参考价值。

题目链接:UVA - 1476

题目大意:

寻找函数F(X)的最低点。

已经f(x) = ax2 + bx + c

F(x) = max(Si(x)), i = 1 . . . n.

题目分析:

可以使用三分来进行查找。

二分可以用于查找单调递增或者单调递减的函数,

三分可以用于查找一个凸(凹)性函数,即函数一边不严格单调递增,一边不严格单调递减。

这里mark一个讲三分的博客:

三分查找

给出代码:

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 //char s[1000000+10];
 6 int n;
 7 struct node
 8 {
 9     double a;
10     double b;
11     double c;
12 }nodes[10000+10];
13 double f(double x)
14 {
15    double s=10001*(-1);
16    //cout<<x<<endl;
17    for(int i=0;i<n;i++)
18    {
19        //double h=
20        double t=nodes[i].a*(x*x)+nodes[i].b*x+nodes[i].c;
21        if(t>s)
22         s=t;
23    }
24    //cout<<s<<endl;
25    return s;
26 }
27 int main()
28 {
29     int T;
30     cin>>T;
31     while(T--)
32     {
33         scanf("%d",&n);
34         for(int i=0;i<n;i++)
35         {
36             scanf("%lf%lf%lf",&nodes[i].a,&nodes[i].b,&nodes[i].c);
37         }
38         double l=0;
39         double r=1010;
40         for(int i=0;i<100;i++)
41         {
42             double mid=(l+r)/2;
43             double midd=(mid+r)/2;
44             if(f(mid)<f(midd))
45                 r=midd;
46             else
47                 l=mid;
48         }
49         //cout<<f(l)<<endl;
50         printf("%.4lf\n",f(l));
51     }
52     return 0;
53 }
View Code

 

以上是关于UVA - 1476 - Error Curves的主要内容,如果未能解决你的问题,请参考以下文章

UVa1476 Error Curves

UVA 5009 Error Curves

Uva5009 Error Curves

UVa1476

uva 1476(三分)

Error Curves HDU - 3714