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. ML.NET 示例:二元分类之用户评论的情绪分析

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  2. Error【0007】:zabbix中因为curl版本过低而无法发送邮件

    1. 错误背景 在centos6.5上,源码部署zabbix最新版本zabbix-3.2.14.部署后之后,在配置邮件发送报警时出错 2. 错误提示 3. 原因分析 从网上检索的结果是说,系统中的cu ...

  3. Jmeter(二十九)_dotnet搭建本地接口服务

    这里使用的服务名为Bookshelf,在github上,自行下载.要运行此服务,需要.Net Core SDK 2.1或更高版本.如果尚未安装,从.Net Core官方网站下载并安装. 在本地克隆项目 ...

  4. vim命令记录

    最近开始用vim作为日常编辑器,由于vim的命令过多,现在记录一下

  5. sqli-labs less 1-4

    sqli-labs less 1-4 数字型注入 当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入. 测试步骤: (1) 加单引号,URL:www.text.com/text.php?id ...

  6. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

  7. Docker容器学习梳理 - SSH方式登陆容器

    前面几篇已经介绍了Docker基础环境的部署,下面介绍下通过ssh方式登陆Docker容器的操作记录(其实不太建议直接用ssh去连接上容器的想法,虽然可以,但是有很多弊端,而且docker已经提供了容 ...

  8. 测试网站页面网速的一个简单Python脚本

    无聊之余,下面分享一个Python小脚本:测试网站页面访问速度 [root@huanqiu ~]# vim pywww.py #!/usr/bin/python # coding: UTF-8 imp ...

  9. 转发:C#操作SQL Server数据库

    转发自:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html 1.概述 2.连接字符串的写法 3.SqlConnection对象 ...

  10. git常用命令点击查看

    创建git项目仓库 $git init 配置个人登记信息,这样团队协作的时候,就可以看到哪个用户修改过哪些文件的 $git config --global user.name 'cfanbo' $gi ...