codevs 3498 小木棍
2017-03-25 07:49
162 查看
3498 小木棍
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过100。
输入描述 Input Description
输入文件共有二行。
输出描述 Output Description
输出文件仅一行,表示要求的原始木棍的最小可能长度。
样例输入 Sample Input
9
5 2 1 5 2 1 5 2 1
样例输出 Sample Output
6
数据范围及提示 Data Size & Hint
N<=60
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过100。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入描述 Input Description
输入文件共有二行。
第一行为一个单独的整数N表示看过以后的小木柜的总数,其中N≤60,第二行为N个用空个隔开的正整数,表示N跟小木棍的长度。
输出描述 Output Description
输出文件仅一行,表示要求的原始木棍的最小可能长度。
样例输入 Sample Input
9
5 2 1 5 2 1 5 2 1
样例输出 Sample Output
6
数据范围及提示 Data Size & Hint
N<=60
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m1,sum,num; int a[65],ans=1; bool c[65],bo; void doit(int x) { ///每次搜索后c【i】数组不清空,因为排序后从大到小搜已经最优; for(int i=n;i>=1;i--) if(c[i]==0&&x-a[i]>=0) { if(a[i]==a[i+1]&&c[i+1]==0) continue; ///优化五:若前面有一个与当前要拼接的木棍长度相同且未被使用,则该木棒一定不被使用; ///因为sort为从小到大排,所以倒着搜,前一个为i+1 c[i]=1; x-=a[i]; if(x==0) { bo=1; return; } doit(x); if(bo) return; x+=a[i]; c[i]=0; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a+1,a+n+1);//优化一:先排序 /* for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl;*/ int l=sum/2+1; for(int j=a ;j<=l;j++)//优化二:搜所给木棒的最大长度到总长度的一半 { bo=0; memset(c,0,sizeof(c)); if(sum%j==0)//优化三:原棒长度必须被总长度整除 { doit(j);///优化四:当前长度第一次搜索必须满足,否则当前长度错误; if(bo==1) { ///第一次搜索成功后,while进行第n次搜索并将num减一,若num为零则长度符合条件 ///因为从大到小搜,故搜到的第一次为最小值。 num=sum/j; while(bo==1) { num--; bo=0; doit(j); //num放哪儿都可以。 } if(num==0) { cout<<j<<endl; return 0; } } } } cout<<sum<<endl; return 0; }
相关文章推荐
- 【DFS&&搜索剪枝】CODE[VS] 3498 小木棍
- CodeVS3498 小木棍
- 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP
- POJ 1011 Sticks CODE[VS] 3498 小木棍(DFS+剪枝优化)
- codevs 3037 线段覆盖 5,codevs 3012 线段覆盖 4,codevs 3027 线段覆盖 2
- 【codevs2452】【SCOI2005】【BZOJ1088】扫雷Mine
- CODE[VS]3269 混合背包 (背包DP模板集合)
- vscode使用vue中的v-for提示错误
- 潜伏者(codevs 1171)
- codevs1922(二分图最大独立集)
- VS code python调试
- CODEVS-孪生蜘蛛
- [codevs3145] 汉诺塔游戏
- VS Code修改选中文字或代码的颜色
- 用VS Code写Python程序
- CODE[VS] 1001 舒适的路线
- [Codevs1403]新三国争霸(MST+DP)
- T1008 选数 codevs
- [codevs3295]落单的数