洛谷 1120 小木棍 [数据加强版]
2017-01-13 17:04
211 查看
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入输出格式
-输入格式:
输入文件共有二行。第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65
(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)
第二行为N个用空个隔开的正整数,表示N根小木棍的长度。
输出格式:
输出文件仅一行,表示要求的原始木棍的最小可能长度输入输出样例
输入样例#1:
95 2 1 5 2 1 5 2 1
输出样例#1:
6分析:
其实这题就是个简单的搜索(过程省略)但是因为是数据加强版所以要有几个剪枝:①先从大到小排序,从大到小搜,因为小的作用比大的要大。
②假如当前搜索的木棍加上当前已经在拼起来的木棍已经大于要组成的木棍就退出
③搜索到与前一根同样长度的木棍,如果前一根木棍已经不能用,那么当前木棍也不能用
④如果当前木棍刚好符合条件就退了。
注意:
①记得滤掉大于五十的木棍。
代码
#define N 1000 #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int t, m, n, j, k, sum, cnt, maxn; int a ; bool b ; bool flag; inline int cmp(const int&x, const int&y) { return x > y; } inline void dfs(int l, int s, int p) { if(flag) return; if(s == m) { s = 0; l++; p = 0; } if(l == t) { flag = 1; return; } for(int i = p + 1; i <= j; i++) { if(s + a[i] > m || b[i]) continue; if(a[i] == a[i - 1] && !b[i - 1]) continue; b[i] = 1; dfs(l, s + a[i], i); b[i] = 0; if(flag)return; if(s == 0)return; if(m-s == a[i])return; } if(flag)return; } int main() { scanf("%d" , &n); maxn = -N; for(int i = 1; i <= n; i++) { int s; scanf("%d" , &s); if(s <= 50) { a[++j] = s; sum += a[j]; maxn = max(maxn, a[j]); } } sort(a + 1, a + j + 1, cmp); for(int i = maxn; i <= sum; i++) { if(sum % i == 0) { t = sum / i; m = i; flag = 0; dfs(0, 0, 0); if(flag) { cout << i << endl; return 0; } } } }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 在SQL Server 2005所有表中搜索某个指定列的方法
- Android的搜索框架实例详解
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- WordPress中用于获取搜索表单的PHP函数使用解析
- easyui combobox开启搜索自动完成功能的实例代码
- 使用JS轻松实现ionic调用键盘搜索功能(超实用)
- JavaScript中数组的排序、乱序和搜索实现代码
- jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
- jquery ztree实现树的搜索功能
- 【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
- Ajax实现智能提示搜索功能
- C#编程实现Excel文档中搜索文本内容的方法及思路