zoukankan      html  css  js  c++  java
  • 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 x2 + 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
     
    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]
    ",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]
    ",l,r);
     60                 else printf("[%.4lf, %.4lf) U (%.4lf, %.4lf]
    ",l,1.0*A,1.0*A,r);
     61             }
     62             else
     63             {
     64                 if(fabs(A-l) < eps)printf("(%.4lf, %.4lf]
    ",l,r);
     65                 else printf("[%.4lf, %.4lf)
    ",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)
    ");
     78                     else printf("(-INF, %.4lf) U (%.4lf, INF)
    ",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)
    ",l,1.0*A,1.0*A);
     93                         else printf("(%.4lf, INF)
    ",l);
     94                     }
     95                     else printf("(%.4lf, INF)
    ",l);
     96                 }
     97                 else
     98                 {
     99                     if(!fA)
    100                     {
    101                         if(B == D*A)printf("(%.4lf, INF)
    ",l);
    102                         else printf("[%.4lf, %.4lf) U (%.4lf, INF)
    ",l,1.0*A,1.0*A);
    103                     }
    104                     else printf("[%.4lf, INF)
    ",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)
    ",1.0*A,1.0*A,r);
    117                         else printf("(-INF, %.4lf)
    ",r);
    118                     }
    119                     else printf("(-INF, %.4lf)
    ",r);
    120                 }
    121                 else
    122                 {
    123                     if(!fA)
    124                     {
    125                         if(B == D*A)printf("(-INF, %.4lf)
    ",r);
    126                         else printf("(-INF, %.4lf) U (%.4lf, %.4lf]
    ",1.0*A,1.0*A,r);
    127                     }
    128                     else printf("(-INF, %.4lf]
    ",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)
    ");
    144                 else printf("(-INF, %.4lf) U (%.4lf, INF)
    ",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)
    ",(double)A,(double)A,y0,y0);
    154                     else if(!fA && A > y0+eps)
    155                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)
    ",y0,y0,(double)A,(double)A);
    156                     else printf("(-INF, %.4lf) U (%.4lf, INF)
    ",y0,y0);
    157                 }
    158                 else
    159                 {
    160                     if(!fA)
    161                         printf("(-INF, %.4lf) U (%.4lf, INF)
    ",(double)A,(double)A);
    162                     else printf("(-INF, INF)
    ");
    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)
    ",(double)A,(double)A,y1,y2);
    183                     else if(!fA && A > y2 + eps)
    184                         printf("(-INF, %.4lf] U [%.4lf, %.4lf) U (%.4lf, INF)
    ",y1,y2,(double)A,(double)A);
    185                     else printf("(-INF, %.4lf] U [%.4lf, INF)
    ",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)
    ",(double)A,(double)A,y1,y2);
    191                     else if(!fA && A > y2 + eps)
    192                         printf("(-INF, %.4lf] U (%.4lf, %.4lf) U (%.4lf, INF)
    ",y1,y2,(double)A,(double)A);
    193                     else printf("(-INF, %.4lf] U (%.4lf, INF)
    ",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)
    ",(double)A,(double)A,y1,y2);
    199                     else if(!fA && A > y2 + eps)
    200                         printf("(-INF, %.4lf) U [%.4lf, %.4lf) U (%.4lf, INF)
    ",y1,y2,(double)A,(double)A);
    201                     else printf("(-INF, %.4lf) U [%.4lf, INF)
    ",y1,y2);
    202                 }
    203                 else
    204                 {
    205                     if(!fA && A < y1 - eps)
    206                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)
    ",(double)A,(double)A,y1,y2);
    207                     else if(!fA && A > y2 + eps)
    208                         printf("(-INF, %.4lf) U (%.4lf, %.4lf) U (%.4lf, INF)
    ",y1,y2,(double)A,(double)A);
    209                     else printf("(-INF, %.4lf) U (%.4lf, INF)
    ",y1,y2);
    210                 }
    211             }
    212         }
    213     }
    214     return 0;
    215 }
  • 相关阅读:
    采用泛型链接多类型数据库[含源码]
    .NET 框架中的 Factory 模式
    .NET2.0 框架中的 AbstractFactory 模式
    Microsoft Ajax 脚本浅析
    Refactoring to Patterns 项目实践
    自动校验控件演示[含源码]
    用户定制Asp2.0 WebPart菜单
    设计模式三重天[之二]
    回DUDU关于discuzNT 模版的一些疑惑
    设计模式三重天[之一]
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3353077.html
Copyright © 2011-2022 走看看