POJ 1011 Sticks 解题报告
2013-11-04 12:44
465 查看
参考(其实是完全移植了)这里的解题报告:http://blog.sina.com.cn/s/blog_6635898a0100lgq0.html。
感觉搜索题做伤了。短期之内不会再做了。
首先,sticks要从大到小排序。因为大的stick相对难找,一开始就确定好有利于更快地确定解。
其次,记下当前正在匹配的stick,下次从这个stick之后开始试。
再次,如果当前的stick和前一个stick的长度一样,而前一个stick没有选(前一个stick肯定一个尝试过了,没选是因为没有解),说明这个stick也不用尝试了。
个人认为要点在于链接中的第3点,即如果当前len等于0,即(匹配完了上一段或最开始),新开始一段时,只需要取第一个没选的(也是最大的,因为sticks已经从大到小排序好了。)。不用再像普通循环里面的那样,一个一个尝试了。因为如果有解,这个第一个stick迟早要选,而且位置在哪里都不关心,所以第一个选它就可以了。
code已经改得和链接上面几乎完全一样了。这里为了日后记录,遂粘贴与此。
感觉搜索题做伤了。短期之内不会再做了。
首先,sticks要从大到小排序。因为大的stick相对难找,一开始就确定好有利于更快地确定解。
其次,记下当前正在匹配的stick,下次从这个stick之后开始试。
再次,如果当前的stick和前一个stick的长度一样,而前一个stick没有选(前一个stick肯定一个尝试过了,没选是因为没有解),说明这个stick也不用尝试了。
个人认为要点在于链接中的第3点,即如果当前len等于0,即(匹配完了上一段或最开始),新开始一段时,只需要取第一个没选的(也是最大的,因为sticks已经从大到小排序好了。)。不用再像普通循环里面的那样,一个一个尝试了。因为如果有解,这个第一个stick迟早要选,而且位置在哪里都不关心,所以第一个选它就可以了。
code已经改得和链接上面几乎完全一样了。这里为了日后记录,遂粘贴与此。
#include <algorithm> #include <iostream> using namespace std; const int MAXN = 65; int N, len; int sticks[MAXN]; bool mark[MAXN]; bool flag; void recur(int depth, int l, int k) { if(flag) { return; } if(l == 0) { int i = 0; while(mark[i]) { i++; } mark[i] = true; recur(depth + 1, sticks[i], i + 1); mark[i] = false; return; } if(l == len) { if(depth == N) { flag = true; } else { recur(depth, 0, 0); } return; } for(int i = k; i < N; i++) { if(!mark[i] && l + sticks[i] <= len) { if(!mark[i - 1] && sticks[i - 1] == sticks[i]) { continue; } mark[i] = true; recur(depth + 1, l + sticks[i], i + 1); mark[i] = false; } } } int main() { while(scanf("%d", &N) && N != 0) { flag = false; int sum = 0; for(int i = 0; i < N; ++i) { fscanf(stdin, "%d", &sticks[i]); sum += sticks[i]; // fprintf(stdout, "sticks[%d]: %d\n", i, sticks[i]); } sort(sticks, sticks + N, greater<int>()); for(len = sticks[0]; len <= sum; ++len) { if(sum % len == 0) { // memset(mark, false, N * sizeof(bool)); memset(mark, false, sizeof(mark)); recur(0, 0, 0); if(flag) { fprintf(stdout, "%d\n", len); break; } } } } return 0; }
相关文章推荐
- POJ 1011 Sticks 解题报告
- ACM poj 1011 Sticks解题报告源代码【转】
- poj 1011 Sticks解题报告【DFS+剪枝】
- Poj 1011 解题报告
- 解题报告 poj 1011 木棒
- POJ 1065 Wooden Sticks 解题报告-用动态规划方法解决(LIS变式)
- POJ 2362 POJ1011解题报告
- 解题报告 poj 1011 木棒
- pku 1011 sticks 搜索+剪枝 解题报告
- POJ 1011(Sticks)解题纠错
- poj 2485 解题报告
- POJ 2159(古代加密) 解题报告
- POJ 1016(自总结数 字符串处理) 解题报告
- POJ 1046(颜色映射 简单数学) 解题报告
- 【原创】POJ 1703 && RQNOJ 能量项链解题报告
- poj1008"Maya Calendar"解题报告
- 最小生成树,POJ和HDU几道题目的解题报告(基于自己的模板)
- POJ 3076 Sudoku 解题报告(Dancing Link)
- POJ 2922 Honeymoon Hike 解题报告(二分+深搜)
- POJ 1308 Is It A Tree? 解题报告