zoukankan      html  css  js  c++  java
  • OpenJudge 2787 算24

    1.链接地址:

    http://poj.org/problem?id=1631

    http://bailian.openjudge.cn/practice/2787/

    2.题目:

    总时间限制:
    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
    

    3.思路:

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 
     8 
     9 double a[4];
    10 bool used[4];
    11 bool f(int k)
    12 {
    13     int i,j;
    14     if(k == 1)
    15     {
    16         for(i = 0; i < 4; ++i)
    17         {
    18             if(!used[i])
    19             {
    20                 if(fabs(a[i] - 24) < 0.0001) return true;
    21                 else return false;
    22             }
    23         }
    24         return false;
    25     }
    26     else
    27     {
    28         for(i = 0; i < 4; ++i)
    29         {
    30             if(!used[i])
    31             {
    32                 for(j = i + 1; j < 4; ++j)
    33                 {
    34                     if(!used[j])
    35                     {
    36                         double v1 = a[i];
    37                         double v2 = a[j];
    38                         used[j] = true;
    39 
    40                         a[i] = v1 + v2;
    41                         if(f(k - 1)) return true;
    42 
    43                         a[i] = v1 * v2;
    44                         if(f(k - 1)) return true;
    45 
    46                         a[i] = v1 - v2;
    47                         if(f(k - 1)) return true;
    48 
    49                         a[i] = v2 - v1;
    50                         if(f(k - 1)) return true;
    51 
    52                         a[i] = v1 / v2;
    53                         if(f(k - 1)) return true;
    54 
    55                         a[i] = v2 / v1;
    56                         if(f(k - 1)) return true;
    57 
    58                         a[i] = v1;
    59                         used[j] = false;
    60                     }
    61                 }
    62             }
    63 
    64         }
    65     }
    66     return false;
    67 }
    68 
    69 int main()
    70 {
    71     //freopen("C://input.txt","r",stdin);
    72 
    73 
    74     cin >> a[0] >> a[1] >> a[2] >> a[3];
    75     while(a[0] != 0 || a[1] != 0 || a[2] != 0 || a[3] != 0)
    76     {
    77         memset(used,0,sizeof(bool) * 4);
    78 
    79         if(f(4)) cout << "YES" << endl;
    80         else cout << "NO" << endl;
    81 
    82         cin >> a[0] >> a[1] >> a[2] >> a[3];
    83     }
    84 
    85     return 0;
    86 }
  • 相关阅读:
    贪心算法 Wooden Sticks
    HDOJ 2189 悼念512汶川大地震遇难同胞——来生一起走
    hdoj1069 Monkey and Banana(最长上升子序列)
    2012级计科《程序设计基础Ⅱ》期末上机考试
    Constructing Roads In JGShining's Kingdom
    c语言学习随笔之指针(二)
    c语言学习随笔之指针(一)
    遍历网页框架结构
    笔记本测试软件(让奸商头疼的软件)0
    ResizePicturevb.net
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3560286.html
Copyright © 2011-2022 走看看