点此看题面

大致题意: 给你\(N\)根小木棍,请你把它们拼成若干根长度相同的木棍,问你最小可能长度。

枚举+\(dfs\)

显然的,木棍的长度肯定是\(\sum_{i=1}^n len[i]\)的一个因数,且肯定大于\(max(len[i])\)。因此,我们只要在这个范围内枚举答案并用\(dfs\)来验证即可。

另外,只要找到一个答案,我们就可以立刻结束程序了(这应该是显然的)。

这样不就好了吗?

等等,一个裸的暴搜显然是卡不过去的(如果能过当我没说),必须要加上大量的剪枝才可以。

一大波剪枝

这道题木棍的长度在\(50\)以内,所以显然我们可以用桶来存储。

我们可以从大到小来枚举每一个长度,只要当前长度加上已经拼接好的木棍的长度不会超过当前所要验证的长度,我们就对其进行\(dfs\)。

还有一个小优化就是,在每一次\(dfs\)结束后,若原先并没有已经拼接好的木棍,或者已经拼接好的木棍的长度加上当前长度恰好等于当前所要验证的长度,我们就立刻结束枚举,因为这根木棍肯定是要选的,这两种情况下选了肯定比不选状态更优。

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define LL long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define tc() (A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++)
#define pc(ch) (pp_<100000?pp[pp_++]=(ch):(fwrite(pp,1,100000,stdout),pp[(pp_=0)++]=(ch)))
#define N 65
int pp_=0;char ff[100000],*A=ff,*B=ff,pp[100000];
using namespace std;
int n,maxx=0,minn=1e9,a[N+5];
inline void read(int &x)
{
x=0;char ch;
while(!isdigit(ch=tc()));
while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void dfs(int x,int Min,int v,int ans)//用dfs来验证一个答案是否可行
{
if(!x) {write(ans),fwrite(pp,1,pp_,stdin);exit(0);}//如果可行,就直接输出答案,结束程序
if(v==ans) {dfs(x-1,maxx,0,ans);return;}//如果当前木棍的长度刚好为要验证的长度,说明拼好了一根木棍,就将剩余要拼接的木棍的根数减1,并可以重新从最大的开始枚举了
if(ans-v<minn) return;//如果当前已拼好的木棍的长度加上最短的一根木棍的长度都比要验证的木棍长度大,就说明不可行,退出函数
for(register int i=Min;i>=minn;--i)//从上一次使用的木棍长度开始从大到小枚举木棍长度
{
if(v+i<=ans&&a[i])//如果已拼好的木棍长度加上当前长度不大于要验证的长度,且还有该长度的木棍
{
--a[i],dfs(x,i,v+i,ans),++a[i];//将该长度的木棍的根数减1,dfs,然后回溯
if(v+i==ans||!v) break;//如果已拼好的木棍长度加上当前长度刚好等于要验证的长度,或者没有已拼好的木棍,则无论如何都不会比选这根木棍要优,因此退出循环,结束枚举
}
}
}
int main()
{
register int i;int x,sum=0;
read(n);
for(i=1;i<=n;++i)
{
read(x);
if(x>50) continue;//按照题目要求,自动过滤超过50的长度
++a[x],maxx=max(maxx,x),minn=min(minn,x),sum+=x;//更新每种长度的木棍根数、最长的木棍的长度、最短的木棍的长度、木棍长度和
}
for(i=maxx;;++i)//从最长的木棍的长度开始枚举
if(!(sum%i)) dfs(sum/i,maxx,0,i);//最终答案肯定是sum的因数,用dfs来验证
}

【洛谷1120】小木棍(一道有技巧的dfs)的更多相关文章

  1. 洛谷P1120 小木棍

    洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长 ...

  2. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  3. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  4. 洛谷P1120 小木棍 [搜索]

    题目传送门 题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍 ...

  5. 洛谷—— P1120 小木棍 [数据加强版]

    https://www.luogu.org/problem/show?pid=1120 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接 ...

  6. 一本通&&洛谷——P1120 小木棍 [数据加强版]——题解

    题目传送 一道特别毒瘤能提醒人不要忘记剪枝的题. 首先不要忘了管理员的话.忘把长度大于50的木棍过滤掉真的坑了不少人(包括我). 显然是一道DFS题 .考虑剪枝. 找找搜索要面临的维度.状态:原始木棍 ...

  7. 洛谷P1120小木棍[DFS]

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  8. 洛谷 P1120 小木棍 [数据加强版]解题报告

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

  9. [洛谷P1120]小木棍 [数据加强版]

    题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...

  10. 洛谷P1120 小木棍(sticks数据加强版)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

随机推荐

  1. 学习笔记:首次进行JUnit+Ant构建自动的单元测试(二)

    关键字:JUnit,Ant,单元测试 终于把JUnit+Ant构建单元测试的大概了解了,其实我实践的过程是对了,只是指导博客(看到这里不懂请看我上一篇博客)本身的错误“成功”把我带入“坑”,有时候网友 ...

  2. 大部分人的努力程度之低,根本轮不到拼天赋-----作者meiya

            格式的正确与否,直接影响了人得阅读感受. 看到书写格式正确,分段清楚,没有错别字,叙事有条理的邮件只有寥寥几封,大多都是一段到底,标点混乱,表达不清,主题不明,短短三行就有两个错别字. ...

  3. OSD

    OSD(on-Screen Display)屏幕单式调节方式 主要功能是显示一个用户控制界面和一些系统状态信息. 简单点说:OSD技术就是在屏幕的原有图像上面叠加显示相关信息(包括文字.图片等)的技术 ...

  4. 监听Listener的简介及分类

    一.监听器简介 > Listener是JavaWeb中三大组件之一.Servlet.Filter.Listener > 三大组件都有的共同特点,都需要实现一个接口,并在web.xml文件配 ...

  5. Visual Studio 2017&C#打包应用程序详细教程,重写安装类获取安装路径

    Visual Studio搞了个Click One,在线升级是方便了,但对于俺们这苦逼的业余程序猿就... 别着急,折腾一下,还是能做出打包安装程序的.请移步CSDN看smallbabylong的文章 ...

  6. MySQL zip安装问题

    今天安装mysql的压缩版出现了问题,就是服务总是启动不了,折腾了两三个小时.后面实在是想不明白,就直接把注册表的东西删了. 如果你之前安装过mysql,则进行删除mysql:E:\work\mysq ...

  7. À peu près là 隐私政策

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  8. AT2689 Prime Flip

    传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...

  9. :input获得焦点时被弹出键盘挡住解决办法

    这个是移动端非常常见的bug了,这里说下综合的解决办法,因为有时候你的办法就是会失效.. 上代码 /*input框调起输入法盖住输入问题*/$('input[type="text" ...

  10. spring boot 报错

    错误1: 循环 的 请求. ..例如  cirle..url 在返回的模板路径上 加速 "/" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 错误2 : 添加了sh ...