一、题意简述:
现有N张(0
<=20) 点数小等于10的扑克牌。要求从N张牌中任选若干张分成M墩(每墩不超过5张),使得每墩的各张牌经过加、减、乘或添加括号的运算后都能得到24这个数字。
二、算法分析:
这是一道搜索题,下面给出一种较为高效的搜索方法:
1、首先求出所有可以计算出24点的牌墩,并记录下来。这部分预处理可以通过深度搜索来实现。它的状态空间的规模为
。在检验牌墩时,每次选出两张没有用过的牌,并选择一种运算,从而得到一张新的牌,直到只剩下一张牌就可以判断它是不是24。检验的费用约为:
。由此可见,预处理的时间耗费不大。
2、然后对这些可以计算出24点的牌墩进行组合搜索,使得在不出现重复的牌的前提下选取尽可能多的牌墩,从而实现题目的要求。考虑到满足可以计算出24点的牌墩的数量并不多,所以这一部分的搜索量也是可以忍受的。在实现时可以进行一些优化,如优先选取牌数较少的排墩,进行上界估计等等,都可以从一定程度上提高算法的时间效率。
附运行时间表格:
|
运行时间 |
|
运行时间 |
数据1 |
0.00s |
数据11 |
0.05s |
数据2 |
0.00s |
数据12 |
0.38s |
数据3 |
0.00s |
数据13 |
0.44s |
数据4 |
0.00s |
数据14 |
0.00s |
数据5 |
0.00s |
数据15 |
0.44s |
数据6 |
0.00s |
数据16 |
0.05s |
数据7 |
0.00s |
数据17 |
0.00s |
数据8 |
0.05s |
数据18 |
0.00s |
数据9 |
0.00s |
数据19 |
0.05s |
数据10 |
0.00s |
数据20 |
0.71s |
(测试环境:PIII600EB / 64MB)
三、总结:
近年来搜索题在国际国内赛场出现的频率有所减少,但是,搜索题对于训练编程技巧和算法的优化能力都很有益处。选手在解决搜索题时,首先要有全局观,权衡影响搜索效率的各方面因素,选择一个正确高效的搜索方式,然后在此基础上考虑各种优化方法,优化时要注意优化费用和优化效果的平衡。由此可见,加强搜索题的训练是很有意义的。
Sgoi4第二试第三题《外公的难题》题目、测试数据和标准程序由重庆刘汝佳同学提供,借此表示衷心的感谢。