洛谷 P1120 小木棍 [数据加强版]
来源:互联网 发布:小米手机数据迁移应用 编辑:程序博客网 时间:2024/05/21 07:48
题目来源:https://www.luogu.org/problem/show?pid=1120
在各网站提交了不下20次,终于AC了.......
一开始是用贪心做的,并没有考虑已拼接成的木棍在回溯时还会再拆开重组。程序跑得飞快但总WA几个点。在各网站提交都是WA。
后来看了题解,做法都和我不一样,但我却找不出错误。
生成了几组数据用题解对拍,才找出错误......
但会正解后,又TLE了几次,最后在题解的指引下剪了几个枝才AC。
先排序,再枚举长度,木棍从大到小依次验证是否可拼接成所枚举的长度,一旦不可行则直接回溯。
几个剪枝:
1.如果某个长度不可行,则与之相同长度的必然不行,因而不用去搜。
2.一旦拼接成功,直接输出结果,退出程序。
3.枚举木棍长度时一定要保证木棍总长能够被其整除,否则不必验证。
不同网站对>50的长度要求不同,洛谷上要求滤掉>50的长度。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <queue>using namespace std;int n;int a[100];int cnt=0;bool vis[100];bool dfs(int num,int len,int s,int pos){ int ok=1; if(num==1){printf("%d",s);exit(0);} int p=-1; for(int i=pos;i>=1;i--) { if(!vis[i]&&a[i]!=p) { vis[i]=1; if(len+a[i]<s) { if(dfs(num,len+a[i],s,i-1)){printf("%d",s);exit(0);} if(len==0){vis[i]=0;return 0;} ///// } if(len+a[i]==s) { if(dfs(num-1,0,s,cnt)){printf("%d",s);exit(0);} else{vis[i]=0;break;} } vis[i]=0; p=a[i]; } } return 0;}int main(){ scanf("%d",&n); int l=0; int sum=0; for(int i=1;i<=n;i++) { int c;scanf("%d",&c); if(c<=50) { sum+=c; a[++cnt]=c; l=max(l,c); } } sort(a+1,a+1+cnt); for(int i=l;;i++) { if(sum%i==0) { memset(vis,0,sizeof(vis)); if(dfs(sum/i,0,i,cnt)) { printf("%d",i); return 0; } } } return 0;}
0 0
- 洛谷 P1120 小木棍 [数据加强版]
- 【搜索】洛谷 P1120 小木棍 [数据加强版]
- 【洛谷】P1120 小木棍[数据加强版]
- P1120 小木棍 [数据加强版]
- P1120 小木棍 [数据加强版]
- luogu P1120 小木棍 [数据加强版]
- 洛谷 P1120 小木棍 [数据加强版 ]
- 洛谷P1120 小木棍[数据加强版](回溯法)
- P1120 小木棍 数据加强版
- P1120 小木棍(数据加强版)
- P1120 小木棍 [数据加强版]
- 洛谷p1120小木棍【数据加强版】c++
- 洛谷P1120 小木棍
- 洛谷 【P1120】 小木棍
- 小木棍 [数据加强版]
- 洛谷 1120 小木棍 [数据加强版]
- 洛谷1120 小木棍 [数据加强版] dfs+剪枝(史上最详尽)
- [P1120]小木棍
- MySQL中BLOB字段类型介绍
- (提高篇)第十五讲 项目 简化的银行储蓄系统(函数版)
- android动画的setAnimation与startAnimation的区别
- 最值
- 堆和栈的区别
- 洛谷 P1120 小木棍 [数据加强版]
- python中尝试pip install PIL,出现错误的解决方法
- 【NOIP2012】Day1T3 开车旅行
- ios中生产者模式实例:非激励广告架构的优化过程
- 单例模式Singleton 你是唯一
- VOT 2015 Benchmark 使用教程
- poj 1177(线段树扫描线)
- LeetCode 195. Tenth Line (shell)
- sublime text相关插件配置