好啊。。。太棒了。。。


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

最新文章

  1. mac osx 安装redis扩展
  2. java反编译获取源码
  3. 【mysql】关于checkpoint机制
  4. 鸟哥的Linux私房菜学习笔记(1)
  5. Oracle体系结构及备份(十七)——bg-others
  6. Unable to list the users SQLSTATE =S0002
  7. android的引用库类
  8. 按钮开关demo
  9. Python 员工信息管理系统
  10. C#事件与委托详解
  11. mui项目实时更新
  12. layui基本使用
  13. Day 4-5 序列化 json &amp; pickle &amp;shelve
  14. Day8--------------RPM包管理
  15. webpack2利用插件clean-webpack-plugin来清除dist文件夹中重复的文件
  16. Beta冲刺(4/5)(麻瓜制造者)
  17. ssdb安装注意事项
  18. Hadoop全分布模式操作
  19. python数据分析之csv/txt数据的导入和保存
  20. OGNL入门

热门文章

  1. Camera.Parameters 参数 &lt;转&gt;
  2. 使用GSON来生成JSON数据
  3. os模块 os.stat(&#39;path/filename&#39;) os.path.dirname(path) os.path.exists(path)&#160; os.path.join(path1[, path2[, ...]])
  4. NULL、0、nullptr
  5. 【总结整理】IFeatureBuffer
  6. Ros疑问汇总
  7. MyBatis02 MyBatis基础知识之Mapper映射器
  8. ROS Learning-026 (提高篇-004 A Mobile Base-02) 控制移动平台 --- “分封制”
  9. NIO、AIO
  10. p2657 windy数