HDU 4423 Simple Function(数学题,2012长春D题)

Simple Function

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 111    Accepted Submission(s): 31

Problem Description Knowing that x can be any real number that x
2 + Dx + E ≠ 0. Now, given the following function:

What is the range of y?  

 

Input The first line contains a single integer T (T ≤ 10000), indicating that there are T cases below.

Each case contains five integers in a single line which are values of A, B, C, D and E (-100 ≤ A, B, C, D, E ≤ 100).  

 

Output For each case, output the range of y in the form of standard interval expression like in a single line.

The expression is made up by one interval or union of several disjoint intervals.

Each interval is one of the following four forms: “(a, b)”, “(a, b]”, “[a, b)”, “[a, b]”(there is a single space between ‘,’ and ‘b’), where a, b are real numbers rounded to 4 decimal places, or “-INF” or “INF” if the value is negative infinity or positive infinity.

If the expression is made up by several disjoint intervals, put the letter ‘U’ between adjacent intervals. There should be a single space between ‘U’ and nearby intervals.

In order to make the expression unique, the expression should contain as minimum of intervals as possible and intervals should be listed in increasing order.

See sample output for more detail.  

 

Sample Input 5 1 1 1 2 3 0 1 0 1 -10 -3 -1 0 -1 -1 0 0 0 0 0 1 3 0 2 0  

 

Sample Output [0.3170, 1.1830] (-INF, INF) (-INF, -1.8944] U [-0.1056, INF) [0.0000, 0.0000] (-INF, 1.0000) U (1.0000, 1.5000) U (1.5000, INF)  

 

Source
2012 Asia ChangChun Regional Contest  

 

Recommend zhuyuanchen520  

 

 

 

 

2012长春的D题,当年只有两个队过,够坑的。

其实就是讨论的情况比较多,折腾了一天终于分析清楚了,还debug了好久。

 

 

我是把分母乘过来分析的。

另外一种分析方法见:

http://blog.happybin.org/archives/zoj_3658_simple-function_2012_changchun_site/

 

我的做法:

 

 

 

 

 

 

 

代码:

  1 /* ***********************************************
  2 Author        :kuangbin
  3 Created Time  :2013-10-5 12:05:22
  4 File Name     :E:\2013ACM\专题强化训练\区域赛\2012长春\D.cpp
  5 ************************************************ */
  6 
  7 #include <stdio.h>
  8 #include <string.h>
  9 #include <iostream>
 10 #include <algorithm>
 11 #include <vector>
 12 #include <queue>
 13 #include <set>
 14 #include <map>
 15 #include <string>
 16 #include <math.h>
 17 #include <stdlib.h>
 18 #include <time.h>
 19 using namespace std;
 20 const double eps = 1e-8;
 21 int main()
 22 {
 23     //freopen("d.in","r",stdin);
 24     //freopen("out.txt","w",stdout);
 25     int A,B,C,D,E;
 26     int T;
 27     scanf("%d",&T);
 28     while(T--)
 29     {
 30         scanf("%d%d%d%d%d",&A,&B,&C,&D,&E);
 31         if(B == D*A && C == E*A)
 32         {
 33             printf("[%.4lf, %.4lf]\n",1.0*A,1.0*A);
 34             continue;
 35         }
 36         bool fA;//值域包不包含A
 37         if(B == D*A)fA = false;
 38         else
 39         {
 40             /*
 41             double ttx = (double)(E*A-C)/(B-D*A);
 42             if(fabs(ttx*ttx + D*ttx + E) < eps)fA = false;
 43             else fA = true;
 44             */
 45             int t1 = E*A - C;
 46             int t2 = B-D*A;
 47             if((long long)t1*t1 +(long long)D*t2*t1 +(long long)E*t2*t2 == 0)fA = false;
 48             else fA = true;
 49         }
 50         if(D*D < 4*E)
 51         {
 52             int a = D*D - 4*E;
 53             int b = 4*A*E + 4*C - 2*B*D;
 54             int c = B*B - 4*A*C;
 55             double l = (-b+sqrt(1.0*b*b-4.0*a*c))/(2.0*a);
 56             double r = (-b-sqrt(1.0*b*b-4.0*a*c))/(2.0*a);
 57             if(B != D*A)
 58             {
 59                 if(fA)printf("[%.4lf, %.4lf]\n",l,r);
 60                 else printf("[%.4lf, %.4lf) U (%.4lf, %.4lf]\n",l,1.0*A,1.0*A,r);
 61             }
 62             else
 63             {
 64                 if(fabs(A-l) < eps)printf("(%.4lf, %.4lf]\n",l,r);
 65                 else printf("[%.4lf, %.4lf)\n",l,r);
 66             }
 67             continue;
 68         }
 69         if(D*D == 4*E)
 70         {
 71             int f1 = 4*A*E + 4*C - 2*B*D;
 72             double tt1 = (-D)/(2.0);
 73             if(f1 == 0)//
 74             {
 75                 if(B*B > 4*A*C)
 76                 {
 77                     if(fA)printf("(-INF, INF)\n");
 78                     else printf("(-INF, %.4lf) U (%.4lf, INF)\n",1.0*A,1.0*A);
 79                 }
 80                 else while(1);//****
 81                 //while(1);
 82             }
 83             else if(f1 > 0)
 84             {
 85                 double l = (double)(-B*B + 4*A*C)/f1;
 86                 double tt2 = -(B-D*l)/(2*A - 2*l);
 87                 if(fabs(tt2 - tt1) < eps)
 88                 {
 89                     if(!fA)
 90                     {
 91                         if(B != D*A)
 92                             printf("(%.4lf, %.4lf) U (%.4lf, INF)\n",l,1.0*A,1.0*A);
 93                         else printf("(%.4lf, INF)\n",l);
 94                     }
 95                     else printf("(%.4lf, INF)\n",l);
 96                 }
 97                 else
 98                 {
 99                     if(!fA)
100                     {
101                         if(B == D*A)printf("(%.4lf, INF)\n",l);
102                         else printf("[%.4lf, %.4lf) U (%.4lf, INF)\n",l,1.0*A,1.0*A);
103                     }
104                     else printf("[%.4lf, INF)\n",l);
105                 }
106             }
107             else
108             {
109                 double r = (double)(-B*B + 4*A*C)/f1;
110                 double tt2 = -(B-D*r)/(2*A - 2*r);
111                 if(fabs(tt2 - tt1) < eps)
112                 {
113                     if(!fA)
114                     {
115                         if(B != D*A)
116                             printf("(-INF, %.4lf) U (%.4lf, %.4lf)\n",1.0*A,1.0*A,r);
117                         else printf("(-INF, %.4lf)\n",r);
118                     }
119                     else printf("(-INF, %.4lf)\n",r);
120                 }
121                 else
122                 {
123                     if(!fA)
124                     {
125                         if(B == D*A)printf("(-INF, %.4lf)\n",r);
126                         else printf("(-INF, %.4lf) U (%.4lf, %.4lf]\n",1.0*A,1.0*A,r);
127                     }
128                     else printf("(-INF, %.4lf]\n",r);
129                 }
130             }
131             continue;
132         }
133         if(D*D > 4*E)
134         {
135             double root1 = (double)(-D + sqrt(D*D - 4*E) )/2;
136             double root2 = (double)(-D - sqrt(D*D - 4*E))/2;
137             int a = D*D - 4*E;
138             int b = 4*A*E + 4*C - 2*B*D;
139             int c = B*B - 4*A*C;
140             long long deta = (long long)b*b - (long long)4*a*c;
141             if(deta < 0)
142             {
143                 if(fA)printf("(-INF, INF)\n");
144                 else printf("(-INF, %.4lf) U (%.4lf, INF)\n",1.0*A,1.0*A);
145             }
146             else if(deta == 0)
147             {
148                 double y0 = (double)(-b)/(2*a);
149                 double tt2 = (double)(D*y0 - B)/(2*(A-y0));
150                 if(fabs(tt2 - root1) < eps || fabs(tt2 - root2) < eps)
151                 {
152                     if(!fA && A < y0 - eps)
153                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)\n",(double)A,(double)A,y0,y0);
154                     else if(!fA && A > y0+eps)
155                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)\n",y0,y0,(double)A,(double)A);
156                     else printf("(-INF, %.4lf) U (%.4lf, INF)\n",y0,y0);
157                 }
158                 else
159                 {
160                     if(!fA)
161                         printf("(-INF, %.4lf) U (%.4lf, INF)\n",(double)A,(double)A);
162                     else printf("(-INF, INF)\n");
163                 }
164             }
165             else
166             {
167                 double y1 = (double)(-b-sqrt(1.0*b*b-4.0*a*c))/(2*a);
168                 double y2 = (double)(-b+sqrt(1.0*b*b-4.0*a*c))/(2*a);
169                 double tt1 = (double)(D*y1 - B)/(2*(A-y1));
170                 double tt2 = (double)(D*y2 - B)/(2*(A-y2));
171                 bool fy1 = true;
172                 bool fy2 = true;
173                 if(fabs(tt1 - root1) < eps || fabs(tt1 - root2) < eps)
174                     fy1 = false;
175                 if(fabs(tt2 - root1) < eps || fabs(tt2 - root2) < eps)
176                     fy2 = false;
177                 if(!fA && fabs(y1 - A) < eps)fy1 = false;
178                 if(!fA && fabs(y2 - A) < eps)fy2 = false;
179                 if(fy1 && fy2)
180                 {
181                     if(!fA && A < y1 - eps)
182                         printf("(-INF, %.4lf) U (%.4lf, %.4lf] U [%.4lf, INF)\n",(double)A,(double)A,y1,y2);
183                     else if(!fA && A > y2 + eps)
184                         printf("(-INF, %.4lf] U [%.4lf, %.4lf) U (%.4lf, INF)\n",y1,y2,(double)A,(double)A);
185                     else printf("(-INF, %.4lf] U [%.4lf, INF)\n",y1,y2);
186                 }
187                 else if(fy1 && !fy2)
188                 {
189                     if(!fA && A < y1 - eps)
190                         printf("(-INF, %.4lf) U (%.4lf, %.4lf] U (%.4lf, INF)\n",(double)A,(double)A,y1,y2);
191                     else if(!fA && A > y2 + eps)
192                         printf("(-INF, %.4lf] U (%.4lf, %.4lf) U (%.4lf, INF)\n",y1,y2,(double)A,(double)A);
193                     else printf("(-INF, %.4lf] U (%.4lf, INF)\n",y1,y2);
194                 }
195                 else if(!fy1 && fy2)
196                 {
197                     if(!fA && A < y1 - eps)
198                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U [%.4lf, INF)\n",(double)A,(double)A,y1,y2);
199                     else if(!fA && A > y2 + eps)
200                         printf("(-INF, %.4lf) U [%.4lf, %.4lf) U (%.4lf, INF)\n",y1,y2,(double)A,(double)A);
201                     else printf("(-INF, %.4lf) U [%.4lf, INF)\n",y1,y2);
202                 }
203                 else
204                 {
205                     if(!fA && A < y1 - eps)
206                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)\n",(double)A,(double)A,y1,y2);
207                     else if(!fA && A > y2 + eps)
208                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)\n",y1,y2,(double)A,(double)A);
209                     else printf("(-INF, %.4lf) U (%.4lf, INF)\n",y1,y2);
210                 }
211             }
212         }
213     }
214     return 0;
215 }

 

 

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/kuangbin/p/3353077.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞