hdu3714 水三分

题意:
      给你一些函数 y = ax^2 + bx + c,的a >= 0 的二次函数,x的范围是0--1000,
问你在这个范围内函数值最大的最小是多少,最大指的是对于某一个x最大的那个y,最小指的是全体的x范围中最大的那个最小..


思路:

      因为a>=0 所以都是开口向上的,如果话F(n) 的 xy( x<= 0 && x <= 1000),图像肯定是单调或者凹性的,所以直接三分就行了..


#include<stdio.h>
#include<math.h>

#define eps 1e-9
#define N 10000 + 100

typedef struct
{
   double a ,b ,c;
}NODE;

NODE node[N];

double F(double x ,int n)
{
   double ans = -1000000000;
   for(int i = 1 ;i <= n ;i ++)
   {
      double y = node[i].a * x * x + node[i].b * x + node[i].c;
      if(ans < y) ans = y;
   }
   return ans;
}

double Search3(int n)
{
   double low ,up ,mid ,mmid;
   low = 0 ,up = 1000;
   double dis1 ,dis2;
   while(1)
   {
      mid = (low + up) / 2;
      mmid = (mid + up) / 2;
      dis1 = F(mid ,n);
      dis2 = F(mmid ,n);
      if(dis1 > dis2) low = mid;
      else up = mmid;
      if(up - low < eps) break;
   }
   return dis1;
}

int main ()
{
   int t ,n ,i;
   scanf("%d" ,&t);
   while(t--)
   {
      scanf("%d" ,&n);
      for(i = 1 ;i <= n ;i ++)
      scanf("%lf %lf %lf" ,&node[i].a ,&node[i].b ,&node[i].c);
      printf("%.4lf
" ,Search3(n));
   }
   return 0;
}

原文地址:https://www.cnblogs.com/csnd/p/12063158.html