NOJ 1561 算24
2016-10-21 22:46
99 查看
2016.10.13
【题目描述】
1561.算24(中间结果出现分数)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
算24的一个经典例子是5 5 5 1,在中间结果可以出现分数的情况下是有解的。(5-1/5)*5
在允许中间结果是分数的情况下,如何编写一个算24的程序。
输入
4个1~13之间的整数。
输出
在允许中间结果是分数的情况下,能得到24输出“Yes”,否则输出“No”。
输入样例
5 5 5 1
输出样例
Yes
【解题思路】
对于输入的四个数,首先利用回溯算法枚举他们的排列顺序,其次对于每一种顺序枚举运算符与运算顺序。特别注意的是除数为0的处理。
【代码实现】
【心得体会】
1.模块化解题的思想,自顶向下的程序设计思想。
2.生成排列的算法
3.对于浮点数比较大小的方法
4.折行的应用
5.对于除数为0的特殊处理
【题目描述】
1561.算24(中间结果出现分数)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
算24的一个经典例子是5 5 5 1,在中间结果可以出现分数的情况下是有解的。(5-1/5)*5
在允许中间结果是分数的情况下,如何编写一个算24的程序。
输入
4个1~13之间的整数。
输出
在允许中间结果是分数的情况下,能得到24输出“Yes”,否则输出“No”。
输入样例
5 5 5 1
输出样例
Yes
【解题思路】
对于输入的四个数,首先利用回溯算法枚举他们的排列顺序,其次对于每一种顺序枚举运算符与运算顺序。特别注意的是除数为0的处理。
【代码实现】
# include <stdio.h> float a[10]; int flag; void search(int ); int run(int ,int ,int ,int ); float solve(float ,float ,float ); float abs(float ); void swap(int ,int ); int main(void) { int i; for (i = 1; i <= 4; ++i) scanf("%f", &a[i]); flag = 0; search(1); if(flag) printf("Yes\n"); else printf("No\n"); return 0; } void search(int k) //用回溯算法生成排列 { int i; if (flag) return; if (k == 5) { if (run(a[1], a[2], a[3], a[4])) flag = 1; } else { for (i = k; i <= 4; ++i) { swap(i,k); search(k + 1); swap(i,k); } } } int run(int a, int b, int c, int d) { int i, j, k; for (i = 0; i <= 3; ++i) for (j = 0; j <= 3; ++j) for (k = 0; k <= 3; ++k) if (abs(solve(solve(solve(a,b,i),c,j),d,k)-24) < 0.00001 || abs(solve(solve(a,b,i),solve(c,d,j),k)-24) < 0.00001 || abs(solve(a,solve(b,solve(c,d,i),j),k)-24) < 0.00001 || abs(solve(solve(a,solve(b,c,i),j),d,k)-24) < 0.00001 || abs(solve(a,solve(solve(b,c,i),d,j),k)-24) < 0.00001) //判断对于确定的顺序运算顺序及运算符的使用 return 1; return 0; } float solve(float a,float b,float c) { if (!c) return a + b; if (c == 1) return a - b; if (c == 2) return a * b; if (c == 3) { if (!b) return 1000000;//对于除数为0的特殊处理 else return a / b; } } float abs(float a) { if (a > 0) return a; else return -a; } void swap(int t1,int t2) { int t; t = a[t1]; a[t1] = a[t2]; a[t2] = t; }
【心得体会】
1.模块化解题的思想,自顶向下的程序设计思想。
2.生成排列的算法
3.对于浮点数比较大小的方法
4.折行的应用
5.对于除数为0的特殊处理
相关文章推荐
- 心得24--JDK新特性8-反射3-Method方法.doc
- 数学笔记24——分部积分
- 24、合并两个无序数组,并把合并后的升序数组写入到a.txt中,降序数组写入到b.txt中。要求去掉重复元素
- 加减乘算24
- 24.用dom4j组件解析如下XML格式的文件:
- [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流
- 微软等数据结构+算法面试100题(24)--对称字符串的最大长度
- Apache24并发连接数_适合说有的网站连接数统计
- 11-23~11-24周末计划
- LOJ6226 「网络流 24 题 - 22」 骑士共存 二分图坠大点独立集
- InnoDB: Error number 24 means 'Too many open files'.
- 24 迭代器分类对算法的影响
- centos 安装emacs24
- 每天一个linux命令(24):Linux文件类型与扩展名
- DELPHI-Base24 生成 源码
- LOJ6000 - 「网络流 24 题」搭配飞行员
- 《Effective C#》读书笔记——条目24:用委托实现回调<使用C#表达设计>
- C语言趣味一百道 第26题 2017_12_24
- emacs 24 安装
- 林轩田之机器学习课程笔记( combining predictive features之 adaptive boosting)(32之24)