洛谷—— P1120 小木棍 [数据加强版]
2017-09-05 19:14
281 查看
https://www.luogu.org/problem/show?pid=1120
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入输出格式
输入格式:
输入文件共有二行。
第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65
(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)
第二行为N个用空个隔开的正整数,表示N根小木棍的长度。
输出格式:
输出文件仅一行,表示要求的原始木棍的最小可能长度
输入输出样例
输入样例#1:9 5 2 1 5 2 1 5 2 1输出样例#1:
6
说明
2017/08/05
数据时限修改:
-#17 #20 #22 #27 四组数据时限500ms
-#21 #24 #28 #29 #30五组数据时限1000ms
其他时限改为200ms(请放心食用)
从大到小排序(方便剪枝,小木棒拼接更灵活),搜索 当前未拼得的原木棒的长度,已经凑出的原木棒根数,当前拼出的根数。
#include <algorithm> #include <cstdio> const int N(66); int n,len ,tot,sum,ans; bool cmp(int a,int b) { return a>b; } bool vis ; bool DFS(int nowlenth,int cnt,int num) { if(cnt==tot) return 1; if(!nowlenth) if(DFS(ans,cnt+1,1)) return 1; for(int i=num; i<=n; ++i) { if(vis[i]||len[i]>nowlenth) continue; vis[i]=1; if(DFS(nowlenth-len[i],cnt,i+1)) return 1; vis[i]=0; if(len[i]==nowlenth||nowlenth==ans) break; //如果当前长度不能拼出下一根木棒,最大的失效则没有可以全部拼出的情况 for( ;len[i+1]==len[i]; ) ++i;//剪去等长的木棒 } return 0; } inline void read(int &x) { x=0; register char ch=getchar(); for(;ch>'9'||ch<'0';) ch=getchar(); for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; } int AC() { read(n); for(int i=1,x; i<=n; ++i) { read(x); if(x>50) { i--;n--; continue; } len[i]=x,sum+=x; } std::sort(len+1,len+n+1,cmp); for(ans=len[1]; ans<=sum; ++ans) { if(sum%ans) continue; tot=sum/ans; if(DFS(ans,0,1)) { printf("%d\n",ans); return 0; } } return 0; } int Hope=AC(); int main(){;}
相关文章推荐
- 洛谷 P1120 小木棍 [数据加强版]
- 洛谷 P1120 小木棍[数据加强版]
- 洛谷p1120小木棍【数据加强版】c++
- 洛谷 P1120 小木棍 [数据加强版 ]
- 洛谷P1120 小木棍 [数据加强版]
- AC日记——小木棍【数据加强版】 洛谷 P1120
- 【洛谷】P1120 小木棍[数据加强版]
- 【搜索】洛谷 P1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版](poj 1011)
- 洛谷 1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版]
- 洛谷Oj-P1120 小木棍 [数据加强版]-剪枝
- P1120 小木棍 [数据加强版]
- P1120 小木棍 数据加强版
- P1120 小木棍(数据加强版)
- P1120 小木棍 [数据加强版]
- [洛谷原创]小木棍 [数据加强版]
- 洛谷1120 小木棍 [数据加强版] dfs+剪枝(史上最详尽)
- P1120 小木棍 [数据加强版]