hdu 3714 Error Curves(三分)

http://acm.hdu.edu.cn/showproblem.php?pid=3714

【题意】:

  题目意思看了很久很久,简单地说就是给你n个二次函数,定义域为[0,1000], 求x在定义域中每个x所在的n个函数的最大值的最小值。很拗口吧,显然这题不是组队或者耐心的做是不知道性质的,至少我没看出来。网上说是三分,我画了几个图,确实是。根据二次函数的性质,增长的快慢已经确定了,那的确是单峰的。那就OK了。另外eps的问题1e-8还是wa,1e-9AC。想了下,因为有系数a,b,c的缘故,一乘就WA了。代码就是三分了,没什么特殊的。(三分,什么时候我能主动的看出你???)

【题解】:

  第二个三分,三分啊三分,很难自己看出来啊!!!

【code】:

  

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <math.h>
 5 
 6 using namespace std;
 7 
 8 #define eps 1e-9
 9 #define INF 1e15
10 
11 struct Nod
12 {
13     double a,b,c;
14 }node[10010];
15 
16 int n;
17 
18 double func(double a,double b,double c,double x)
19 {
20     return a*x*x+b*x+c;
21 }
22 
23 double getMins(double x)
24 {
25     int i;
26     double maks = -INF;
27     for(i=0;i<n;i++)
28     {
29         double temp = func(node[i].a,node[i].b,node[i].c,x);
30         if(maks<temp)
31         {
32             maks = temp;
33         }
34     }
35     return maks;
36 }
37 
38 void sanfen()
39 {
40     double l=0,r=1000,mid,ans = INF;
41     while(l<=r)
42     {
43         mid = (l+r)/2;
44         double temp1 = getMins(mid);
45         double temp2 = getMins(mid-eps);
46         if(temp1<temp2)
47         {
48             l = mid + eps;
49         }
50         else
51         {
52             r = mid - eps;
53         }
54         if(ans>temp1)
55         {
56             ans=temp1;
57         }
58     }
59     printf("%.4lf\n",ans);
60 }
61 
62 int main()
63 {
64     int t;
65     scanf("%d",&t);
66     while(t--)
67     {
68         scanf("%d",&n);
69         int i;
70         for(i=0;i<n;i++)
71         {
72             scanf("%lf%lf%lf",&node[i].a,&node[i].b,&node[i].c);
73         }
74         sanfen();
75     }
76     return 0;
77 }

 

 

 

posted @ 2013-09-12 20:51  crazy_apple  阅读(870)  评论(0编辑  收藏  举报