uva 1476(三分)

三分求一堆最大值中的最小

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=10000+100;
const int inf=0x3f3f3f3f;
double a[maxn],b[maxn],c[maxn];
int t,n;
double f(double x)
{
       double maxi=a[1]*x*x+b[1]*x+c[1];
     for(int i=2;i<=n;i++)
     {
        double mm=a[i]*x*x+b[i]*x+c[i];
         maxi=max(maxi,mm);
     }
      return maxi;
}
double sanfen(double l,double r)
{
    while(r-l>1e-10)
    {
        double p=l+(r-l)/3.0;
        double q=r-(r-l)/3.0;
      if(f(p)<=f(q))
        r=q;
      else l=p;
    }
    return l;
}
int main()
{
      scanf("%d",&t);
      while(t--)
      {    scanf("%d",&n);
           for(int i=1;i<=n;i++)
              scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
            double x=sanfen(0,1000.0);
           printf("%.4lf\n",f(x));
      }
    return 0;
}
时间: 2024-10-12 16:22:28

uva 1476(三分)的相关文章

UVA 1476 - Error Curves(三分法)

UVA 1476 1476 - Error Curves 题目链接 题意:给几条下凹二次函数曲线,然后问[0,1000]所有位置中,每个位置的值为曲线中最大值的值,问所有位置的最小值是多少 思路:三分法,由于都是下凹函数,所以所有曲线合并起来,仍然是一个下凹函数,满足单峰,用三分求极值 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using na

UVA - 1476 Error Curves 三分

                                       Error Curves Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which has many interesting properties.In order to test

UVA - 1476 Error Curves (三分搜索)

Description Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which has many interesting properties. In order to test the algorithm's efficiency, she collect

UVa 1476 - Error Curves

题目:给你n条开口向上的二次曲线Si(a>0),定义F(x) = max(Si(x)),求F(x)的最小值. 分析:三分.F(x)是一个单峰函数,先单调递减后单调递增,利用三分求最小值. 首先,证明两个二次函数构造的F2(x)为单峰函数: (如果不成立,则存在两个连续的波谷,交点处一个函数递增另一个递减,矛盾,不会取递减函数) 然后,用数学归纳法证明,Fi(x)为单峰函数,则Fi+1 = max(Fi(x),Si+1(x))也是单峰函数: (如果存在两个(或更多)连续的波谷,交点处一个函数递增另

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

uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)

题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每个半径,用三分求出线段到线段的最短距离,根据最短距离可以确定当前R下每条线段在[0,L]上的可行区间,存在一个点被可行区间覆盖n次. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using n

铁人系列 (1) uva 10385

uva  10385 列出n-1个一元方程,对应成单峰函数,所以用三分求解即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 30; int N; double L, vr[maxn], vk[maxn]; void init () { for (int i = 1; i <= N; i++) { vr[i] = 1/

UVA 10529 - Dumb Bones(概率+区间dp)

UVA 10529 - Dumb Bones 题目链接 题意:你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒,而你的工作也被部分的破坏了. 比如你已经把骨牌摆成了DD__DxDDD_D的形状,而想要在x这个位置再放一块骨牌.它可能会把左边的一块骨牌或右边的三块骨牌碰倒,而你将不得不重新摆放这些骨牌. 这种失误是无法避免的,但是你可以应用一种特殊的放骨牌方法来使骨牌更多的向一个方向倒下. 给出你要摆放的骨牌数目,以及放

UVA 11178-Morley&#39;s Theorem(计算几何_莫雷定理)

Problem D Morley's Theorem Input: Standard Input Output: Standard Output Morley's theorem states that that the lines trisecting the angles of an arbitrary plane triangle meet at the vertices of an equilateral triangle. For example in the figure below