题解0007:小木棍(P1120)

(错误记录)
题目链接:https://www.luogu.com.cn/problem/P1120
题目描述:几根同样长的木棍,小冥把它们随意砍成了n段;
然后他又吃饱了撑的想把木棍拼上;
但是这个小冥是小年痴呆,他忘了他原来是咋切的了;
现在要写一段程序,输入n和切断的每段木棍的长,输出原始木棍的最小可能长度。
题目思路:搜索剪枝,这道题搜索其实很好说,直接从小到大枚举长度,然后递归判断可行性;
难点还是在剪枝上,如果不用剪枝的话只能得9分左右,这道题要用到7个剪枝;
具体的详见代码;
代码:
#include<bits/stdc++.h>
using namespace std;
int n,arr[66]={0},ans,brr[66]={0},we,wer;//arr存木棍长度,brr存木棍是否被用过
bool cmp(int a,int b){//将所有木棍从大到小排序
	return a>b;
}
bool dfs(int a,int b,int c){//a是假定小木棍的剩余长度,b是循环初始值,c是木棍根数
	if(c==wer){//木棍根数对上了
		return 1;
	}
	if(a==0){//一根木棍拼完
		if(dfs(we,1,c+1)){//根数+1
			return 1;
		}
	}
	for(int i=b;i<=n;++i){
	//剪枝3:下次循环的初始值完全可以接上上次循环的结束值
		if(arr[i]<=a&&brr[i]!=1){//木棍没被用过&&长度没超
			brr[i]=1;//标记
			if(dfs(a-arr[i],i+1,c)){//-去长度
				return 1;
			}
			brr[i]=0;//回溯
			if(a==arr[i]||a==we){
			//剪枝4:如果这个木棍长度与剩余长度一样,这已经是最优解了,还不行,那直接返
			//剪枝5:如果剩余长度与假定木棍长度一样,和剪枝4一样,直接返
				return 0;//如果写break可能过不了
			}
			while(arr[i+1]==arr[i]){
			//剪枝6:因为排了序,所以有很多相等的数在一起,遇到相等的数直接跳
				i++;
			}
		}
	}
	return 0;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>arr[i];
		ans+=arr[i];
	}
	sort(arr+1,arr+n+1,cmp);
	for(int i=arr[1];i<=ans/2;++i){//这个数从最小木棍长度开始枚举
	//剪枝1:如果枚举到所有木棍长度+起来/2还没有找到,那结果就一定是所有数加起来了,往下搜没意义了
		if(ans%i==0){
		//剪枝2:只有能被总长度整除的数才有可能是结果,不满足条件的直接扔掉
			we=i;
			wer=ans/we;
			if(dfs(we,1,0)){//递归判断可行性
				cout<<we;
				return 0;//可以直接结束
			}
		}
	}
	cout<<ans;
	return 0;
}题解0007:小木棍(P1120)的更多相关文章
- 题解 P1120 【小木棍 [数据加强版]】
		题面 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮 ... 
- 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
		洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ... 
- 一本通&&洛谷——P1120 小木棍 [数据加强版]——题解
		题目传送 一道特别毒瘤能提醒人不要忘记剪枝的题. 首先不要忘了管理员的话.忘把长度大于50的木棍过滤掉真的坑了不少人(包括我). 显然是一道DFS题 .考虑剪枝. 找找搜索要面临的维度.状态:原始木棍 ... 
- 洛谷 P1120 小木棍 [数据加强版]解题报告
		P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ... 
- [Luogu P1120]小木棍·加强版
		#\(\mathcal{Description}\) 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 \(50\) . 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开 ... 
- 洛谷P1120 小木棍 [搜索]
		题目传送门 题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍 ... 
- [洛谷P1120]小木棍 [数据加强版]
		题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ... 
- 洛谷——P1120 小木棍 [数据加强版]
		P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍 ... 
- 洛谷 P1120 小木棍 [数据加强版]
		P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ... 
随机推荐
- 微服务从代码到k8s部署应有尽有系列(三、鉴权)
			我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ... 
- suse 12 安装git客户端
			suse-linux:~ # zypper addrepo http://download.opensuse.org/repositories/devel:/tools:/scm/SLE_12_SP5 ... 
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
			AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ... 
- Docker 镜像 层结构理解
			镜像到底是什么.镜像的层结构又是什么 通过docker history命令进行分析,镜像是一种其他镜像+文件+命令的组合. 这些镜像的加载.文件导入创建.命令是存在顺序关系的,所以也引出了层的概念. ... 
- windows mysql数据存储路径更改
			背景:之前服务器磁盘很小,随着数据量的不断增加,磁盘不够,所以新申请了更大的磁盘,然后需要将旧路径下的数据迁移到新磁盘上. 1.任务管理器-打开服务,找到mysql的启动项,停止服务,属性查看可执行文 ... 
- jmeter重点(详细)
			之前,写过一篇文章:jmeter,学这些重点就可以了,今天就来把一些重点细节点说一下. 测试计划 可以理解为各种测试元件的容器 其中: 定义整个测试中使用的重复值(全局变量),一般定义服务器的ip.端 ... 
- Meterpreter后渗透阶段之远程桌面开启
			实验目的 学习利用Meterpreter后渗透阶段模块来开启靶机远程桌面 实验原理 利用Meterpreter生成木马,利用木马控制靶机进行远程桌面的攻击 实验内容 利用Meterpreter后渗透阶 ... 
- [题解]UVA11029 Leading and Trailing
			链接:http://vjudge.net/problem/viewProblem.action?id=19597 描述:求n^k的前三位数字和后三位数字 思路:题目要解决两个问题.后三位数字可以一边求 ... 
- 案例十:shell编写nginx服务启动程序
			使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/init.d/nginx start"进行操作和控制,所以写了以下的 ... 
- C#CancellationToken/CancellationTokenSource-取消令牌/取消令牌源  CT/CTS
			详细情况:https://www.cnblogs.com/wucy/p/15128365.html 背景 为什么引入取消令牌? Thread.abort()方法会破坏同步锁中代码的原子逻辑,破坏锁的作 ... 
