Luogu P1120 小木棍 [数据加强版] 来来来我们一起来剪枝,剪枝,剪枝、、、
好啊。。。太棒了。。。
dfs(拼到第几根木棍,这根木棍剩余长度,上一根木棍的位置)
len是木棍的长度,cnt是木棍的个数
震撼人心的剪枝:
1.枚举长度从最大的木棍开始,直到sum/2,因为之后只能是一整个了。。
2.木棍从大往小试,减少状态数;
3.等长木棍搜索后,就跳过另一根等长的,因为状态实际上一样
4.从比上一根长度更短的开始枚举,避免重复状态
5.二分合法长度而不是一个个枚举(实测会快一些)
6.一旦成立就直接return
7.如果 a[i] 不能形成一个可行方案,且 剩余长度==a[i]或==len 代表后面更短的小木棍也拼不成整根木棍,直接 return
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define R register int
using namespace std;
inline int g() {
R ret=; register char ch; while(!isdigit(ch=getchar())) ;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int n,len,sum,cnt;
int a[];
bool v[],flg;
inline int _upper_bound(int l,int r,const int& dst)
{while(l<r) {R md=l+r>>; if(a[md]<=dst) r=md; else l=md+;} return l;}
void dfs(int stk,int res,int lst) {
if(!res) { if(stk==cnt) {flg=true; return ;} R i;
for(i=;i<=n;++i) if(!v[i]) break;
v[i]=true; dfs(stk+,len-a[i],i); v[i]=false; if(flg) return ;
} R tmp=_upper_bound(lst+,n,res),f=;
for(R i=tmp;i<=n;++i) if(!v[i]&&f!=a[i]) {
v[i]=true; dfs(stk,res-a[i],i); v[i]=false; f=a[i];
if(flg) return; if(res==a[i]||res==len) return ;
}
}
signed main() {
R N=g();
for(R i=,x;i<=N;++i) {
x=g(); if(x>) continue;
a[++n]=x,sum+=x;
} sort(a+,a+n+,greater<int>());
for(len=a[];len<=sum>>;++len) {
if(sum%len) continue; cnt=sum/len;
memset(v,false,sizeof(v)); v[]=true;
dfs(,len-a[],); if(flg) break;
} printf("%d\n",flg?len:sum);
}
2019.04.25
Luogu P1120 小木棍 [数据加强版] 来来来我们一起来剪枝,剪枝,剪枝、、、的更多相关文章
- Luogu P1120 小木棍 [数据加强版]
看了题目心中只有一个字——搜索!!! 但是很显然,朴素的搜索(回溯)绝壁超时. 剪枝&优化(要搞很多,要不然过不了) 1:从小到大搜索它们的因数,这样找到就exit. 2:将数据从大到小排序, ...
- 洛谷 P1120 小木棍 [数据加强版]解题报告
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...
- 洛谷——P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ...
- 洛谷 P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...
- 洛谷—— P1120 小木棍 [数据加强版]
https://www.luogu.org/problem/show?pid=1120 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接 ...
- P1120 小木棍 [数据加强版] 回溯法 终极剪枝
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度 ...
- P1120 小木棍 [数据加强版]
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
- P1120 小木棍 [数据加强版](poj 1011)
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
- [洛谷P1120]小木棍 [数据加强版]
题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...
随机推荐
- zookeeper 安装配置注意事项
zoo.cfg 1.server.1/2/3 有几台配置几个 2.配置好hosts映射之后可以用node1替代IP地址 3.dataLogDir 下面配置的logs 的目录一定要创建 4.dat ...
- Windows10更新后无限重启
以安全模式进入系统,禁用或卸载显卡驱动. 重启后重新安装驱动.
- 关于android中出现failed to read row 0,column -1错误
该错误出现的原因是Cursor.getColumnIndex()的参数列名不存在或者错误,这时返回值为-1.出现该错误
- 第2章 netty介绍与相关基础知识
NIO有一个零拷贝的特性.Java的内存有分为堆和栈,以及还有字符串常量池等等.如果有一些数据需要从IO里面读取并且放到堆里面,中间其实会经过一些缓冲区.我们要去读,它会分成两个步骤,第一块它会把我们 ...
- jquery获取元素在文档中的位置信息以及滚动条位置(转)
jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886 原文链接 原创 201 ...
- 2018 - Start Up
转眼2017已经过去,从大四下学期出来实习,到现在工作一年多了,很遗憾没有经营好自己博客园&CSDN. 献上一篇鼓励工程师写blog的博客:https://kb.cnblogs.com/pag ...
- ubuntu16.04 安装opencv3.4
1.去官网下载opencv,在本教程中选用的时opencv3.4.1,其他版本的配置方法异曲同工. 下载链接http://opencv.org/releases.html,选择sources版本 2. ...
- 【转】手把手教你用Strace诊断问题
原博客地址:http://huoding.com/2015/10/16/474 早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人 ...
- hive的not in
最近项目需要对数据做打平操作,原有的sql使用了not in,但是hive 不支持 not in,晚上搜索了下使用 left outer join select * from lefttbl a le ...
- boost::python的使用
boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法 python自身提供了一个Python/C AP ...