POJ 1011 (poj 2362强化版) 搜索
2015-08-21 16:50
274 查看
题意:2362中是给很多小木棍,问是否可以组合成一个正方形,这道题是给很多小木棍,首先它满足肯定可以组成一个正多边形,让你求这个正多边形边最多时的边长,就是最小边长。
强化版的2362,其实只要比我写的2362多加一个优化就可以过了,当然这个优化也可以用到2362中,这样能体验到飞一般的速度。虽然只是多加一个优化,这个优化很难想,我是看了众神犇的博客才搞懂这个优化的。
2362中的那些优化在这里就不强调了,可以去那里看看(下面代码中我也会标注的):
链接: POJ 2362 搜索
那个所说的多加的一个优化,体现在代码上仅仅是一句话:
if(!sum) break;
解释一下:如果当前i做某条边的第一个小木棍失败,那么就停止循环,如果不停止它会继续循环,找当前边的第一个小木棍,第二个……如果找到了组成当前边的所有木棍,就会开始找下一条边,那么这个i又会做下一条边的第一个小木棍,显然它会失败,如此循环,i是不会被用到的,所以是不会成功的。所以在一开始i当作某条边的第一个小木棍失败时就应该跳出循环。
强化版的2362,其实只要比我写的2362多加一个优化就可以过了,当然这个优化也可以用到2362中,这样能体验到飞一般的速度。虽然只是多加一个优化,这个优化很难想,我是看了众神犇的博客才搞懂这个优化的。
2362中的那些优化在这里就不强调了,可以去那里看看(下面代码中我也会标注的):
链接: POJ 2362 搜索
那个所说的多加的一个优化,体现在代码上仅仅是一句话:
if(!sum) break;
解释一下:如果当前i做某条边的第一个小木棍失败,那么就停止循环,如果不停止它会继续循环,找当前边的第一个小木棍,第二个……如果找到了组成当前边的所有木棍,就会开始找下一条边,那么这个i又会做下一条边的第一个小木棍,显然它会失败,如此循环,i是不会被用到的,所以是不会成功的。所以在一开始i当作某条边的第一个小木棍失败时就应该跳出循环。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n, a[65], sum, side, num; bool used[65]; bool cmp(int a, int b){ return a > b; } bool s(int edge, int sum, int last){ if(sum == side) edge++, sum = last = 0; if(edge == num-1) return 1; //优化:在能整除的情况下才开启的搜索,所以n边形成功搜索出n-1条边即可 for(int i = last+1; i <= n; i++){ //优化:为了避免例如{1,2,3,4},选{1,2}失败后又选{2,1}这种本质相同的组合 if(used[i] || a[i] + sum > side) continue; if(a[i] == a[i-1] && !used[i-1]) continue;//优化:如果木棍i搜索失败,等长的也会失败 used[i] = 1; if(s(edge, sum+a[i], i)) return 1; used[i] = 0; if(!sum) break; //本篇博客中所提到的优化 } return 0; } int main() { while(scanf("%d", &n) && n){ memset(used, 0, sizeof used); sum = 0; for(int i = 1; i <= n; i++){ scanf("%d", a+i); sum += a[i]; } sort(a+1, a+n+1, cmp); side = a[1]-1; // 优化:最终多边形的边长肯定要长于任何单个小木棍的 while(1){ side++; if(sum % side) continue; //优化:正多边形边长和肯定要能整除边长 num = sum / side; if(s(0, 0, 0)) { printf("%d\n", side); break; } } } }
相关文章推荐
- 提交Spark第一个程序
- java 中ClassLoader 的加载顺序
- 【Material Design视觉设计语言】开篇
- jqPaginator分页插件
- git学习——<二>git配置文件
- Define custom @Required-style annotation in Spring
- 电赛总结(四)——波形发生芯片总结之AD9854
- 六、自动包含所有.cpp的android.mk
- 黑马程序员——Java基础---继承、抽象、接口(二)
- Rsync 服务器搭建
- day3: 继承、初始化方法、便利构造器
- iOS 遇到的bug
- css position
- 图论07——经过指定两点的最短路
- 设计模式笔记(五)--命令模式
- Linux GCC常用命令
- Windows Server 2012如何部署Domain Controller
- knowledge_map 修改笔记
- URI,URL与URN区别
- 获取控件的宽高的两种方法