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的更多相关文章
随机推荐
- Intellij Idea 工具在java文件中如何避免 import .*包
Intellij Idea工具在java文件中怎么避免import java.utils.*这样的导入方式,不推崇导入*这样的做法!Editor->Code Style->Java-> ...
- 日志监控系统中,大批量查询mysql方案
最近开发遇到一个问题:需要查询一个大时间段内的数据,分1000个小段,即为1000个点.X轴是时间,Y轴是该小时间段内统计后数据.注意:数据返回是一个list,其中每个对象返回值都是该小时间段内数据统 ...
- Trace-如何跟踪某个Job的开销
1.背景 下面是从以往Profiler收集的跟踪文件中提取Job有关数据 ;with cte as( Duration_ms ,CPU CPU_ms,Reads,Writes,StartTime,En ...
- linux查看进程启动时间
1. ps axu 2. 精确查看 for pid in $(pgrep httpd); do echo -n "${pid} " ; ps -p ${pid} -o lstart ...
- HDU 4504 威威猫系列故事——篮球梦(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 中文都看得懂.不过我是看hint才正确理解什么意思的.开始的时候理解错了. 解题思路: 给定时 ...
- touches
e.touches.length//有多少个手指接触头
- operator->和operator->*
->和->*都是C++中定义的可重载的运算符,其中:->称为成员选择符(member selection),而->*称为成员指针选择符(pointer-to-member se ...
- PL/SQL Developer安装详解(32位客户端免安装版)
PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用.PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/S ...
- Keras学习~第一个例子~跑MNIST
import numpy as npimport gzip import struct import keras as ks import logging from keras.layers impo ...
- 夺命雷公狗-----React---23--小案例之react经典案例todos(完成添加任务)
我们这次来处理用户添加的数据,我们还是赵老规矩看看组建大致图... 子组件对父组建进行数据的传递其实是react内部的机智进行处理的了,, 代码如下所示: <!DOCTYPE html> ...