jshzoi
解题报告——2018级2016第二学期第一周作业
解题报告——2018级2016第二学期第一周作业
D 算24
题目描述
描述
给出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
代码
#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<cstdlib>
using namespace std;
double a[5];bool flag=false;
void dfs(double b[],int k){
if(flag)return ;
if(k==1){
if(fabs(b[1]-24)<1e-4)flag=true;//解是否正确
}
else for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
if(i!=j){
double bb[5];int js=0;
//bb用来存储新状态
//先将没选中的数存入bb
for(int p=1;p<=k;p++)
if(p!=i&&p!=j)bb[++js]=b[p];
double op=1e10;//用来存放计算结果
for(int cf=1;cf<=4;cf++)
switch(cf){
case 1:op=b[i]+b[j];
bb[++js]=op;//将计算结果存入bb
dfs(bb,js);
js--;
break;
case 2:op=b[i]-b[j];
bb[++js]=op;
dfs(bb,js);
js--;
break;
case 3:op=b[i]*b[j];
bb[++js]=op;
dfs(bb,js);
js--;
break;
case 4:if(b[j]!=0){op=b[i]/b[j];
bb[++js]=op;
dfs(bb,js);
js--;}
break;
}
}
}
int main(){
while(1){
flag=false;
for(int i=1;i<=4;i++)
cin>>a[i];
if(a[1]==0)break;//是否读完
dfs(a,4);
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
分析
这题的状态是k个数;
当在只有一个数时那便是问题有解了;所有出口为一个数;
可能的路径:以四变三为例+,*有十二种,/,-有二十四种,总共会有三十六种;
但其中会有可行性判断:除法是除数为0时便不可以;
不过在其中要维护状态那便用a数组和k;
不过为了省时间可以在有正确解(如果le-4)时出去;
没有时用bb存储没有选到的数,然后用switch列举可能的四种运算;
注意:要用double 来存储因为如题目上讲的会有分数;
算法:穷举算法;
jshzoi的更多相关文章
随机推荐
- FIFO简记
FIFO( First In First Out)简单说就是指先进先出的存储方式,在高速外设读取时经常使用. FIFO从读写的时钟可分为同步和异步两种,从信号来说都有读.写使能信号,读.写数据总线,满 ...
- C++学习笔记 四种新式类型转换
static_cast ,dynamic_cast,const_cast,reinterpret_cast static_cast 定义:通俗的说就是静态显式转换,用于基本的数据类型转换,及指针之间的 ...
- spark 基本操作
读取文件的数据 使用的数据:https://codeload.github.com/xsankar/fdps-v3/zip/master 读取单个文件的数据 case class Employee(E ...
- javascript sandbox
用途 https://github.com/gf3/sandbox Can be used to execute untrusted code. Support for timeouts (e.g. ...
- PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌
-自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...
- c++模板函数实例化的偏序机制
一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题: http://stackoverflow.com/questions/18283851/temp ...
- poj 2376 Cleaning Shifts
http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- mac 安装jdk1.5
前期准备 Java安装包 JDK 1.5:Java for Mac OS X 10.5 Update 10(From: Apple) 辅助工具 Pacifist:用于提取*.dmg安装包中的文件(点我 ...
- BeanUtils
BeanUtils包的使用 BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: ...
- Ref和Out参数的区别(转帖)
首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System; class Test { static void Swap(ref int x, ref int ...