搜索,搜索,搜索..........

在经历了无数tle后,终于也很慢很慢的速度ac了它.......大概有15ms吧,光是在pascal中就排了200多名。

题目比较简单:给你若干个值不超过50,数量不超过60的自然数,把给出的所有的数用完且只用一次,使其拼成若干个相等的自然数;

求这个最小的自然数。(题目中表示为木条长度)

在想贪心,想贪心,最后无语发现,它是搜索。

搜索的想法很简单,枚举这个自然数,然后搜索是否能拼成。

闭着眼睛都可以知道这是会tle的,于是,截肢.........不,说错了,是剪枝.........(有点血腥);

首先是一贯作风,搜索中糅合贪心,可以发现,把木棍从大到小排,按这个顺序取是容易得到最优值的----------------剪枝1

然后,发现在拼一根木棍时,可以记录一下,保证是从左往右取的(或者说从大往小),这样不会漏掉情况,可以少搜一点点.....--------------剪枝2

随后,如果某一个木棍拼完之后,其他的拼不了了,就可以剪掉这以后的搜索了,因为看看我们的搜索顺序就知道了-----------------剪枝3

一开始有小到大枚举最优值比较好,但是发现最后从大到小反而比较稳定,因为任何一个 可能作为最优值的数(是给出的数的总和的约数),那它的约数也挂定了--------剪枝4

本以为可以了, 于是一直tle,tle,tle,与此同时,学校分类练习题中这道题的答案被声称数据错误,并且标程也错了,标程中也惊现不知是剪枝还是错误的东东............

无限纠结中...............

终于,在某位不知名大牛的博客里寻得了第5个强力剪枝————在拼某一个数(木条)时,第一个用来拼的数确定之后,如果找不到方案,以后的就不要搜了(很明显,那个 没用的木条最后还是要面对无法配对的命运的.........)

终于 ,以此A掉了它........同时证明了分类练习题中的数据是正确的............感动的偶想要热泪盈眶,毕竟是纠结了一下午的题目。

stick可谓是剪枝发挥到很大极限的了,搜索的剪枝一般思路是贪心,即从某个状态以后不可能更优,甚至不可能可行,然后极不留情的剪掉它,剪掉它.........

贴代码:

program lmd;
varcan:array[0..10000]of boolean;a:array[0..100]of longint;have:array[0..100]of boolean;i,tot,n,try,ans,z,tt,m:longint;yes,bug:boolean;
procedure sort(l,r:longint);
var i,j,x,s:longint;
begini:=l;j:=r;x:=a[(l+r)shr 1];repeatwhile a[i]>x do inc(i);while a[j]<x do dec(j);if i<=j thenbegins:=a[i];a[i]:=a[j];a[j]:=s;inc(i);dec(j);end;until i>j;if i<r then sort(i,r);if l<j then sort(l,j);
end;
procedure dfs(num,now,pos:longint);//pos 剪枝2
var i:longint;
beginif num>z then begin yes:=true;exit;end;for i:=pos+1 to n doif have[i] thenbeginif a[i]+now=try thenbeginhave[i]:=false;dfs(num+1,0,0);have[i]:=true;exit;                  //剪枝3endelse if a[i]+now<try thenbeginhave[i]:=false;dfs(num,now+a[i],i);have[i]:=true;if (now=0) then exit;//终极大招剪枝5if yes then exit;end;end;
end;
beginwhile true do beginread(m);if m=0 then break;tot:=0; n:=0;for i:=1 to m dobeginread(tt);if tt<=50 then begininc(n);a[n]:=tt;tot:=tot+a[n];end;end;sort(1,n);                      //剪枝1fillchar(can,sizeof(can),true);for try:=tot downto a[1] do     beginif can[try] and (tot mod try=0) then     beginyes:=false;z:=tot div try;     fillchar(have,sizeof(have),true);dfs(1,0,0);if yes=true thenans:=tryelsebeginfor i:=a[n] to try-1 do            //剪枝4if try mod i=0 thencan[i]:=false;end;end;end;write(ans);end;
end.

poj1011 stick 强力搜索剪枝相关推荐

  1. poj 1948(搜索+剪枝)

    解题思路:这道题看到数据量,想到应该搜索+剪枝应该可以过..可是别人的A了,我的却超时了... 我用了一个mark[a][b],表示前两条边长度分别为a和b时,是否已经处理过,如果是的话就直接跳出.. ...

  2. LeetCode 47. 全排列 II(回溯+搜索剪枝)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例:输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ] ...

  3. 极大极小搜索 α-β剪枝的实现

    极大极小搜索 α-β剪枝的实现 //---------搜索当前搜索状态极大值--------------------------------// //alpha 祖先节点得到的当前最小最大值,用于al ...

  4. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  5. 玩转VIM编辑器-强力搜索

    玩转VIM编辑器-强力搜索 搜索导航 导航键 描述 / 向前搜索,前向 ? 向后搜索,反向 n 跳转到下一个搜索词所在位置 N 跳转到前一个搜索词所在位置 //或?? 重复前面的搜索或反向搜索 跳转到 ...

  6. USACO 6.5.3 Betsy's Tour 搜索剪枝

    http://train.usaco.org/usacoprob2?a=BI4LEPNXcEa&S=betsy 题目大意:一个N*N的方阵(N<=7),求从左上角出发到左下角结束经过每个 ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 【bfs + 记忆化搜索 + 剪枝】 AC 代码

    ACM 北京区域赛 bfs+剪枝+ms 第一个一遍过的题目,基本没有看题解 记忆搜索当中,注意初始化成一个特殊值:而在访问之后,每个点就会有一个不同于INF(或者 -1等特殊标记)的值 先到先得,适者 ...

  8. Croc Champ 2013 - Round 2 (Div. 2 Edition) 贪心+ 搜索+剪枝 + 数学

    A: 直接找出最小值,看是否能被所有数整除即可 B: 判断是否出现连续的"#">=m若果存在肯定不能调. C: 题意: 两个人玩游戏(A,B),每个人分配一个字符串长度为2* ...

  9. HDU 1026 Ignatius and the Princess I 迷宫范围内的搜索剪枝问题

    这个问题是一个典型的类型的问题迷宫广泛的搜索. 在网上看到了很多解决方案. 没什么解决问题的分析报告,不指出其中的关键点.代码更像是一大抄.一些分析师也有很大的文章分析.只是不要全部命中关键,什么是广 ...

最新文章

  1. 车辆检测--A Closer Look at Faster R-CNN for Vehicle Detection
  2. shell发送网页邮件
  3. Lambda表达式【转】
  4. 8-12-COMPETITION
  5. 数字图像处理之空间域图像增强
  6. Redis基础系列-0x003:String
  7. C语言内存/指针相关
  8. 【Python】pandas模块操作大型数据集
  9. 领导者的资质——学习笔记(3):领导者的十项职责
  10. 乒乓球(洛谷-P1042)
  11. 摄像头拍摄后对图片进行图像处理-python(空域增强)
  12. c++二分答案 之 跳石头
  13. 使用开源库 Objective-C RegEx Categories 处理正则表达式
  14. 怎么在WINDOWS中运行C语言程序,在Windows下运行C语言程序
  15. 【新手基础教程】maix asr(自动语音识别)
  16. CheckBoxPreference组件
  17. 互联网财富管理平台应该怎么做?(下篇)
  18. Unity新创建的物体是灰色的,而且无法通过白色材质球给予纯白色(结果还是灰色)
  19. 用matlab抽奖,现在社会上销售彩票的很多。一家三口在抽奖时,常常喜欢让孩子来抽,请问这是遵循了什么决策原则(   )...
  20. 原生js实现简易版消消乐

热门文章

  1. 对数坐标系与半对数坐标系
  2. Vue中手动导出Element表格为pdf/word/excel格式
  3. 基于asp.net的校园二手交易网站
  4. Android微信暗黑模式的方法,微信“暗黑”模式来了!设置方法拿走不谢
  5. BigDecimal 使用详细说明
  6. 百度地图定位偏差了吗?用微信定位完美解决。
  7. python qt 按钮实现拖放_python qtdesigner 拖拽工具
  8. FW:2013年SCI收录仪器仪表期刊56种目录_拔剑-浆糊的传说_新浪博客
  9. MTK6797 Accdet驱动分析总结
  10. 毕业设计 基于stm32智能火灾监控灭火系统 - 物联网