zoukankan      html  css  js  c++  java
  • OpenJudge

    2787:算24

    时间限制:
    3000ms
    内存限制:
    65536kB
    描述
    给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。

    这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。

    比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
    输入
    输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
    输出
    对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
    样例输入
    5 5 5 1
    1 1 4 2
    0 0 0 0
    
    样例输出
    YES
    NO
    

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cmath>
     4 using namespace std;
     5 const double x = 1e-6;
     6 
     7 double a[5];
     8 
     9 bool dfs(int step)
    10 {
    11     int i,j,k,t;
    12     if(step == 1)
    13     {
    14         if(fabs(a[0]-24)< x)
    15             return 1;
    16         else
    17             return 0;
    18     }
    19     else
    20     {
    21         double m,n;
    22         for(i=0;i<step;i++)
    23             for(j=i+1;j<step;j++)
    24             {
    25                 m = a[i],n = a[j];
    26                 a[j] = a[step - 1]; 
    27                 for(k=1;k<=6;k++)
    28                 {
    29                    // m = a[i],n = a[j];
    30                    // a[j] = a[step - 1]; 
    31                     switch (k)
    32                     {
    33                         case 1:a[i] = m+n;
    34                         if(dfs(step-1)) return 1;
    35                         break;
    36                         case 2:a[i] = m-n;
    37                         if(dfs(step-1)) return 1;
    38                         break;
    39                         case 3:a[i] = n-m;
    40                         if(dfs(step-1)) return 1;
    41                         break;
    42                         case 4:a[i] = m*n;
    43                         if(dfs(step-1)) return 1;
    44                         break;
    45                         case 5:
    46                             if(fabs(n)>=x)
    47                             {   
    48                                 a[i] = m/n;
    49                                 if(dfs(step-1)) return 1;
    50                                 break;
    51                             }
    52                         case 6:
    53                             if(fabs(m)>=x)
    54                             {   
    55                                 a[i] = n/m;
    56                                 if(dfs(step-1)) return 1;
    57                                 break;
    58                             }
    59                     }
    60                 }
    61                 a[i] = m,a[j] = n;
    62             }
    63         }
    64         return 0;//忘啦 
    65 }
    66             
    67 int main()
    68 {
    69     int i,j,k,t;
    70     while(1)
    71     {
    72         memset(a,0,sizeof(a));
    73         double sum = 0;
    74         for(i=0;i<4;i++)
    75         {
    76             cin>>a[i];
    77             sum += a[i];
    78         }
    79         bool flag ;
    80         if(0==sum)
    81             break;
    82         else 
    83             flag = dfs(4);
    84         if(flag)
    85             cout<<"YES"<<endl;
    86         else
    87             cout<<"NO"<<endl;
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    【ACM非算法部分】综合篇
    【解题报告】CF Round #320 (Div. 2)
    【解题报告】13级个人结业赛(二) ——动(dou)态(bu)规(hui)划(zuo)专场
    【解题报告】13级个人结业赛(一) ——涨姿势专场
    【解题报告】三校联盟专场一
    【解题报告】编程之美复赛 ——猜数字
    【解题报告】Codeforces Round #301 (Div. 2) 之ABCD
    【解题报告】编程之美初赛二 扑克牌
    【通知】
    【test】
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2653067.html
Copyright © 2011-2022 走看看