您的位置:首页 > 运维架构

OpenJudge 2787 算24

2014-02-21 23:31 399 查看
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.代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

double a[4];
bool used[4];
bool f(int k)
{
int i,j;
if(k == 1)
{
for(i = 0; i < 4; ++i)
{
if(!used[i])
{
if(fabs(a[i] - 24) < 0.0001) return true;
else return false;
}
}
return false;
}
else
{
for(i = 0; i < 4; ++i)
{
if(!used[i])
{
for(j = i + 1; j < 4; ++j)
{
if(!used[j])
{
double v1 = a[i];
double v2 = a[j];
used[j] = true;

a[i] = v1 + v2;
if(f(k - 1)) return true;

a[i] = v1 * v2;
if(f(k - 1)) return true;

a[i] = v1 - v2;
if(f(k - 1)) return true;

a[i] = v2 - v1;
if(f(k - 1)) return true;

a[i] = v1 / v2;
if(f(k - 1)) return true;

a[i] = v2 / v1;
if(f(k - 1)) return true;

a[i] = v1;
used[j] = false;
}
}
}

}
}
return false;
}

int main()
{
//freopen("C://input.txt","r",stdin);

cin >> a[0] >> a[1] >> a[2] >> a[3];
while(a[0] != 0 || a[1] != 0 || a[2] != 0 || a[3] != 0)
{
memset(used,0,sizeof(bool) * 4);

if(f(4)) cout << "YES" << endl;
else cout << "NO" << endl;

cin >> a[0] >> a[1] >> a[2] >> a[3];
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: