P1120 小木棍 [数据加强版]

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

输入输出格式

输入格式:

输入文件共有二行。

第一行为一个单独的整数\(N\)表示砍过以后的小木棍的总数,其中N≤65

(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)

第二行为\(N\)个用空个隔开的正整数,表示\(N\)根小木棍的长度。

输出格式:

输出文件仅一行,表示要求的原始木棍的最小可能长度

说明

数据时限修改:

-#17 #20 #22 #27 四组数据时限500ms

-#21 #24 #28 #29 #30五组数据时限1000ms

其他时限改为200ms(请放心食用)


这是一个无比毒瘤的搜索题

------序

我们枚举每一个长度\(l\),用爆搜检查这个长度\(l\)是否合法。

关于毒瘤减枝:

剪枝1:\(l\)如果不整除\(sum\),直接再见。这点很容易想到

剪枝2:枚举上下界为\(max\{a_i\}-sum/2\),下界很容易想明白,而上界只是优化了下常数和减枝1一样的。

剪枝3:将木棍从大到小排序进行枚举。这个减枝是以下所有减枝的前提。

剪枝4:在凑成某根木棍时,从它上一次用的木棍编号的下一位开始枚举,因为反过来是一样的。

剪枝5:如果某个长度和上一个长度一样且上一个长度的没有用,那么这个也不能用。

剪枝6:维护一个后缀和数组\(p[i]\),如果当前长度加上最后所有能用的和还不够木棍原长,不能用。

剪枝7:如果从当前编号枚举完整的棍子失败了以后,因为每个残棍都得用上,所以不行。

剪枝8:这是一个贪心性减枝。如果当前长度加上枚举长度失败了以后,不用往后枚举了。

因为哪怕后面有更小的能代替这个枚举长度,也不可能产生更优的结果了。因为更短的长度明显有更多选择。


code:

#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int N=70;
int n,a[N],sum=0,s,len,ans=0,p[N],used[N];
bool cmp(int x1,int x2)
{
return x1>x2;
} void dfs(int last,int k,int l)//剪枝4
{
if(l==len)
{
l=0;
k++;
last=1;
}
if(k==s+1)
{
printf("%d\n",len);
exit(0);
}
for(int i=last;i<=n;i++)
{
if(!used[i]&&l+a[i]<=len)
{
if(a[i]==a[i-1]&&!used[i-1])//剪枝5
continue;
if(l+p[i]<len)//剪枝6
continue;
used[i]=1;
dfs(i+1,k,l+a[i]);
used[i]=0;
if(l==0)//剪枝7
return;
if(a[i]+l==len)//剪枝8
return;
}
}
} int main()
{
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++)
{
int b;
scanf("%d",&b);
if(b<=50)
{
a[++cnt]=b;
sum+=b;
}
}
n=cnt;
sort(a+1,a+1+n,cmp);//剪枝3
for(int i=n;i>=1;i--)
p[i]=p[i+1]+a[i];
for(int i=a[1];i<=sum/2;i++)//剪枝2
{
if(sum%i==0)//剪枝1
{
s=sum/i;
len=i;
dfs(1,1,0);
}
}
printf("%d\n",sum);
return 0;
}

2018.5.22

洛谷 P1120 小木棍 [数据加强版]解题报告的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    玄学剪支,正好复习一下搜索 感觉搜索题的套路就是先把整体框架打出来,然后再一步一步优化剪枝 1.从maxv到sumv/2枚举长度(想一想,为什么) 2. 开一个桶,从大到小开始枚举 3. 在搜索中,枚 ...

  7. P1120 小木棍 [数据加强版] 回溯法 终极剪枝

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

  8. P1120 小木棍 [数据加强版]

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

  9. P1120 小木棍 [数据加强版](poj 1011)

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

随机推荐

  1. vim-plug 插件安装与操作

    安装 vim-plug curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/juneg ...

  2. QQ群管理员申请帖(本次截止日期为2017-03-25)

    本帖专门为技术交流群申请管理员专用. 管理员的权利: 1.有权在成员违规的情况下直接剔除. 2.有权加入多个交流群. 3.有权引人入群. 4.艾特全体是权利,但要慎用,通常情况下,没有我本人的授意,不 ...

  3. linux下文件加密方法总结

    为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本 ...

  4. Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇

    由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...

  5. Spring RPC 入门学习(3)-获取Student对象

    Spring RPC传递对象. 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; import ...

  6. 网站响应式布局/网站自适应问题+rem、em、px、pt及网站字体大小设配

    Bootstrap 网格系统: Bootstrap CSS: Bootstrap 组件及插件: 一.什么是响应式布局?       响应式布局是Ethan Marcotte在2010年5月份提出的一个 ...

  7. BugPhobia发布篇章:Beta版本学霸在线系统正式发布

    0x00:测试报告版本管理 版本号 具体细节 修订时间 V 1.0 整理第一轮迭代用户管理和登陆注册的功能性验证测试,预计将继续网页对浏览器版本的兼容性测试 2015/11/12 V1.0.1 整理第 ...

  8. 第三个Sprint冲刺第4天

    成员:罗凯旋.罗林杰.吴伟锋.黎文衷 讨论内容:各成员汇报各自完成的情况.

  9. Cron任务调度CronNET

    Cron任务调度CronNET 阅读目录 1.Cron介绍和工具 2.CronNET介绍和使用 3.cron-expression-descriptor使用 4.资源 如果用知乎,可以关注专栏:.NE ...

  10. Resolve Missing artifact Issue in maven

    https://jingyan.baidu.com/article/d621e8da0a5b192864913f79.html