洛谷 P1120 小木棍 [数据加强版]解题报告
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 小木棍 [数据加强版]解题报告的更多相关文章
- 洛谷——P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ...
- 洛谷 P1120 小木棍 [数据加强版]
P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...
- 洛谷—— P1120 小木棍 [数据加强版]
https://www.luogu.org/problem/show?pid=1120 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接 ...
- [洛谷P1120]小木棍 [数据加强版]
题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...
- 一本通&&洛谷——P1120 小木棍 [数据加强版]——题解
题目传送 一道特别毒瘤能提醒人不要忘记剪枝的题. 首先不要忘了管理员的话.忘把长度大于50的木棍过滤掉真的坑了不少人(包括我). 显然是一道DFS题 .考虑剪枝. 找找搜索要面临的维度.状态:原始木棍 ...
- 洛谷P1120 小木棍 [数据加强版]搜索
玄学剪支,正好复习一下搜索 感觉搜索题的套路就是先把整体框架打出来,然后再一步一步优化剪枝 1.从maxv到sumv/2枚举长度(想一想,为什么) 2. 开一个桶,从大到小开始枚举 3. 在搜索中,枚 ...
- P1120 小木棍 [数据加强版] 回溯法 终极剪枝
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度 ...
- P1120 小木棍 [数据加强版]
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
- P1120 小木棍 [数据加强版](poj 1011)
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
随机推荐
- 校内模拟赛 Attack's Fond Of LeTri
Attack's Fond Of LeTri 题意: n个房子m条路径边的无向图,每个房子可以最终容纳b个人,初始有a个人,中途超过可以超过b个人,每条边有一个长度,经过一条边的时间花费为边的长度.求 ...
- .net 2.0 使用linq
.net 2.0 使用linq,主要是使用Linq to Object,没有测试Linq to XML. 方法: 新建一个net2.0的程序,然后添加对System.Core.Dll的引用.引用时vs ...
- python 批量下载图片
#coding=utf-8import re,sysimport urllib def getHtml(url): page = urllib.urlopen(url) html = page.rea ...
- Today
I'm facing the major enemy. The information. I don't know when I've been crazy about seeking informa ...
- 如何用chrome查看post get及返回的数据
chrome浏览器按下F12打开开发者工具 点击Network,找到过滤器 筛选XHR,Method那一列会显示POST GET:
- Buy the Ticket HDU 1133
传送门 [http://acm.hdu.edu.cn/showproblem.php?pid=1133] 题目描述和分析 代码 #include<iostream> #include< ...
- 个人作业Week3
个人作业week3 一. 调研,评测 1.我的使用体验 版本:IOS版 BUG_1: 点击单词本中的“同步”后,会提示登录Microsoft账户.登录成功立即开始同步单词本.在单词本同步过程中, ...
- 《Linux内核分析》第五周学习笔记
<Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- Filter学习:项目第八阶段
public interface Filter A filter is an object that performs filtering tasks on either the request ...
- php配置虚拟主机
在httpd.conf的目录下,新建一个配置文件virtualhost-host.conf,添加虚拟主机配置 <VirtualHost *:80> DocumentRoot "E ...