poj1011 stick 强力搜索剪枝
搜索,搜索,搜索..........
在经历了无数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 强力搜索剪枝相关推荐
- poj 1948(搜索+剪枝)
解题思路:这道题看到数据量,想到应该搜索+剪枝应该可以过..可是别人的A了,我的却超时了... 我用了一个mark[a][b],表示前两条边长度分别为a和b时,是否已经处理过,如果是的话就直接跳出.. ...
- LeetCode 47. 全排列 II(回溯+搜索剪枝)
文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例:输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ] ...
- 极大极小搜索 α-β剪枝的实现
极大极小搜索 α-β剪枝的实现 //---------搜索当前搜索状态极大值--------------------------------// //alpha 祖先节点得到的当前最小最大值,用于al ...
- 深搜、广搜、搜索剪枝
搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...
- 玩转VIM编辑器-强力搜索
玩转VIM编辑器-强力搜索 搜索导航 导航键 描述 / 向前搜索,前向 ? 向后搜索,反向 n 跳转到下一个搜索词所在位置 N 跳转到前一个搜索词所在位置 //或?? 重复前面的搜索或反向搜索 跳转到 ...
- USACO 6.5.3 Betsy's Tour 搜索剪枝
http://train.usaco.org/usacoprob2?a=BI4LEPNXcEa&S=betsy 题目大意:一个N*N的方阵(N<=7),求从左上角出发到左下角结束经过每个 ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 【bfs + 记忆化搜索 + 剪枝】 AC 代码
ACM 北京区域赛 bfs+剪枝+ms 第一个一遍过的题目,基本没有看题解 记忆搜索当中,注意初始化成一个特殊值:而在访问之后,每个点就会有一个不同于INF(或者 -1等特殊标记)的值 先到先得,适者 ...
- Croc Champ 2013 - Round 2 (Div. 2 Edition) 贪心+ 搜索+剪枝 + 数学
A: 直接找出最小值,看是否能被所有数整除即可 B: 判断是否出现连续的"#">=m若果存在肯定不能调. C: 题意: 两个人玩游戏(A,B),每个人分配一个字符串长度为2* ...
- HDU 1026 Ignatius and the Princess I 迷宫范围内的搜索剪枝问题
这个问题是一个典型的类型的问题迷宫广泛的搜索. 在网上看到了很多解决方案. 没什么解决问题的分析报告,不指出其中的关键点.代码更像是一大抄.一些分析师也有很大的文章分析.只是不要全部命中关键,什么是广 ...
最新文章
- AI助力清华博士进入周杰伦战队,预告AI应用迎来黄金时代?
- java web 嵌套播放器_网页嵌套播放器
- python变量运算符_Python基础 — 变量和运算符
- 用华为eNSP模拟器配置Hybrid、Trunk和Access三种链路类型端口
- arcgis 10.1 导入数据到oracle 发布地图服务
- [神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress...
- sql server 多用户 并发_Tinyid:滴滴开源千万级并发的分布式ID生成器
- pytorch_gpu案例及gpu使用
- 对variable-sized object may not be initialized的一点理解
- 如何把pdf转成jpg格式?
- After Effects - Bodymovin 插件验货及感受
- php人脸识别代码,PHP实现人脸识别技术
- 5款瞬间复活Win7/8/10工具
- MapReduce的C#实现及单元测试(试验)
- consol32.exe
- php页面导出csv,使用PHP生成并导出CSV文件
- android 前后同时预览_GitHub 上优质项目整理,不只 Android
- iPhone手机开发
- Python爬虫抓取指定网页图片代码实例
- python模拟登陆抖音_抖音模拟登陆的实现
热门文章
- SEO8个方法:如何挖掘长尾关键词
- C#窗体程序连接SQL Server数据库实现账号登录、账号注册、修改密码、账号注销和实名认证(不定时更新)
- 听周华健专辑《少年》有感(二)-献给曾经的自己
- 百变头像框小程序开源 微信小程序源码
- no matching mac found
- 解决前端 node 环境跨域与404问题,yog2
- 动态规划问题的一般解决方案
- 数据科普:期权价格和相关变量的关系(投资必知必会)
- 关于windows Server 服务器MD5报错,System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。
- 【4/13-15】第六章总结+课后题