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 ",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 }