1011. Sticks(木棒) -POJ

【poj1011】木棒 Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。Input输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。第二行是截断以后 阅读详情
Sticks
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 110042 Accepted: 25243

Description

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help him and design a program which computes the smallest possible original length of those sticks. All lengths expressed in units are integers greater than zero.

Input

The input contains blocks of 2 lines. The first line contains the number of sticks parts after cutting, there are at most 64 sticks. The second line contains the lengths of those parts separated by the space. The last line of the file contains zero.

Output

The output should contains the smallest possible length of original sticks, one per line.

Sample Input

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

Sample Output

6
5
推荐指数:※※※※
来源:http://poj.org/problem?id=1011
经典的剪枝问题。
1.以棒子(箱子)的条数为主干,搜索。
2.去掉肯定不能装的,不能整除。
3.去掉相同长度的重复计算。
4.去掉相同状态下的重复计算。
#include <iostream>
#include<string.h>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
int compare_int(const void *a,const void *b){
	int *num_1=(int*)a;
	int *num_2=(int*)b;
	return (*num_2)-(*num_1);
}
int parts_num;
int *parts;
double capacity;
bool *visit;
bool dfs(int curr,int last_sum){//the capacity of current bin, the remain capacity of sum
	if(curr==capacity)
		return dfs(0,last_sum);
	if(last_sum==0)
		return true;
	int i;
	bool seen=false;
	for(i=0;i<=parts_num-1;i++){
		if(false==visit[i]){
			if(curr==0&&seen)
				return false;
			if(i-1>0&&parts[i]==parts[i-1]&&visit[i-1]==false)
				continue;
			if(curr+parts[i]<=capacity){
			visit[i]=true;
			if(dfs(curr+parts[i],last_sum-parts[i])==false)
				visit[i]=false;
			else
				return true;
			}
			seen=true;
		}
	}
	if(i==parts_num)
		return false;
}
int main()
{
	while(cin>>parts_num&&parts_num>0){
		parts=new int[parts_num];
		visit=new bool[parts_num];
		int i,sum;
		for(i=0;i<=parts_num-1;i++){
			cin>>parts[i];
		}
		qsort(parts,parts_num,sizeof(int),compare_int);
		sum=0;
		for(i=0;i<=parts_num-1;i++)
			sum+=parts[i];
		for(i=parts_num;i>=1;i--){
			if(sum%i==0&&sum/i>=parts[0]){
				memset(visit,0,parts_num*sizeof(bool));
				capacity=sum/i;
				if(true==dfs(0,sum)){
					cout<<capacity<<endl;
					break;
				}
			}
		}	
	}	
	return 0;
}


POJ1011-Sticks-经典搜索题详解优化 Sticks http://poj.org/problem?id=1011 解题思路 1.一开始的思路是遍历木棒能组成的所有长度,然后进行许多判断;发现判断过程很复杂,做不了,就换了个思路; 2.遍历所有可能的木棒长度len,并得到木棒的个数cnt; len满足 sum%len==0; cnt=sum/len; 3.得出DFS的终止条件: 拼接成功的木棒 > cnt 或者 无法继续拼接 4 .然后就是这题的精华:各种剪枝与优化 1.木棍应从长到小遍历; 2.限制拼接一根木棒的木棍长度是递减的,因 阅读详情

相关推荐

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 505

POJ1011 Sticks(DFS)

Description: 乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 解题思路: 算法标签:DFS,剪枝 首先先找到木棒的取值范围,最小为木棍中最长的,最大为所有木棍总和。然后进行DFS。 剪枝分别为: 1.当所取木棒长度不能被木棍长度总和整除,自然无需搜索。 2.如果所取木棒长度大于总和 s

TSWorld 422

KV STUDIO的安装与实践(一)

KV STUDIO是一种软件开发工具,用于编写、调试和管理基于Key-Value(键-值)存储的应用程序。KV STUDIO提供了一个集成开发环境(IDE),使开发人员可以方便地创建和管理键-值数据库,并编写逻辑和业务规则来操作和查询这些数据。它支持多种编程语言和平台,并提供了丰富的API和工具来简化开发过程。使用KV STUDIO,开发人员可以快速构建高效、可靠的键-值存储系统,并实现各种应用程序,如缓存、会话管理、配置存储等。本次使用plc进行案例讲解,结合小编的亲身经历,仅供参考!

weixin_47514459的博客 6360

POJ木棒

#include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> #include<algorithm> using namespace std; bool concatenate(int, int, int, int); ...

qq_39503067的博客 320

基于Apache MINA SSHD配置及应用

Apache MINA SSHD是一个基于Java的开源SSH服务器/客户端实现,支持SSH2协议,提供文件传输、shell访问等功能。该代码实现了一个SftpClientService服务类,封装了SFTP文件操作,包括读取文件(readOnce/readLines)和写入文件(writeOnce)等核心功能。通过SftpProperties配置类管理连接参数,并采用Builder模式创建SSH会话。主要特点包括:支持大文件分块传输、自动创建目录、严格的异常处理和...

流沙QuickSand 945

Visual Tracker Benchamark傻瓜式教程(二)

问题  1 1  在调用main.m跑TRE和SRE时,因为会生成相应的.mat数据文件,如果跑完以后发现自己算法生成的.mat文件有问题,那么要把该文件删除,待找到错误原因后,重新生成相应的.mat文件。因为程序中写的是如果已经存在了.mat文件,例如已经存在car4_STC.mat文件,即使该文件中的数据有错误,但是重新跑时会默认该文件中的数据写完,不会重新写入数据 问题  2  b

mingbujingren的专栏 9928

牛客网 NC632 牛牛摆木棒、POJ 1037 美丽的栅栏题解

参考内容: OI题解 - A decorative fence[POJ 1037] poj1037(dP+排列计数) 本文首发于牛客网:题解 | #牛牛摆木棒# 题目 牛客网 NC632 牛牛摆木棒、POJ1037-A decorative fence(美丽的栅栏) 描述 有n个木棒,长度为1到n,给定了一个摆放规则。规则是这样的:对于第 i (2≤i≤n−1)(2 \leq i \leq n-1)(2≤i≤n−1) 个木棒 aia_iai​,(ai>ai−1(a_i > a_{i-1}(a.

Guanngxu的博客 913

PyTorch复现EEG-TCNet踩坑记:从BCI IV2a数据到TCN块缺失的完整解决方案

本文详细解析了使用PyTorch复现EEG-TCNet模型的全过程,重点解决了BCI IV2a数据集预处理和TCN模块缺失的技术难题。通过标准化数据流程、跨受试者验证策略以及三种因果卷积实现方案,为运动想象分类任务提供完整解决方案,帮助研究者高效实现模型复现与优化。

weixin_30699955的博客 319

POJ1011 Sticks(dfs)

Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 Input 输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多少节

GKHack's Blog 1092

CMOS sensor 基础

NA

m0_72053187的博客 1659

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 211

【POJ No. 1011】 木棒 Sticks

【POJ No. 1011】 木棒 Sticks

代码改变世界 341

【软件测试】- 公有云、私有云、混合云简介以及如何在公有云与私有云上分别搭建测试环境

公有云、私有云以及混合云是目前云计算领域的三种主要模式。它们之间的区别主要在于部署方式、数据访问和管理控制的不同。在阿里云或腾讯云上使用 Kubernetes 和 Docker 搭建测试环境可以提供高度的可伸缩性和灵活性。这样的环境非常适合于需要在多种配置和条件下进行测试的复杂应用。通过云服务提供的工具和服务,可以轻松管理和监控整个测试过程。在云服务上搭建测试环境涉及选择合适的云提供商、配置云资源、安装和设置所需软件等步骤。### 1. 选择云服务提供商。

weixin_46453070的博客 2342

poj 1011 sticks(木棒) (dfs+剪枝)

Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 Input 输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后

Loi_yuan的博客 1081

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

poj 1011 sticks

poj 1011 sticks Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 160439 Accepted: 38508 Description George took sticks of the same length and cut them randomly until all parts becam...

miracle from life 349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POJ1011-Sticks

title: POJ1011-Sticks tags:来源ACwing167-木棒POJ1011-Sticks本题被称为是剪枝神题之一,因为剪枝角度多达5种,且难以想象。常规的深搜,普通剪枝无法完成此题很有可能会导致超时。剪枝五种方法列举java代码 c++代码...

持续输出,励志当全栈开发人员 166

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

POJ 1011 Sticks(DFS + 剪枝)

POJ 1011 Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 160960 Accepted: 38639 Description George took sticks of the same length and cut them randomly until all parts be...

ZQYnn's blog 272

poj1011 Sticks (搜索经典好题)

poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the origina...

weixin_30906425的博客 114

dfs+剪枝(poj1011Sticks)

SticksTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 152214 Accepted: 36272DescriptionGeorge took sticks of the same length and cut them randomly until all parts became at most 50 units lon...

luojiushenzi的博客 210

poj 1011 Sticks(dfs+剪枝)

poj 1011 Sticks(dfs+剪枝)

PKU_ZZY的博客 1142

Sticks (POJ - 1011 ,DFS + 强力剪枝)

一.题目链接: POJ-1011 二.题目大意: 给你 n 个小木棍,要求将其中不超过 50 长度的木棍拼成若干个木棒. 并且使木棒的长度均相同,最后输出木棒的最小长度. 三.分析: 这道 dfs 剪枝快剪成了。。。 ①:确定答案的的范围:答案必定比最长木棍长 且必定为不超过 50 木棍长度和的约数. ②:优化搜索顺序. ③:vis 标记去重 + 最优性剪枝 + 排除等效冗...

The___Flash的博客 297

poj 1011 Sticks(经典搜索问题:DFS+剪枝)

题目:出自http://poj.org/problem?id=1011 转自:http://www.qiyeku.com/xinwen/654439.html 描述:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的。对于给定的一组小木棒,请求出原始木棒的最小长度。 思路:              1.看到这个题,就是要把小棒一个个进行比较,看能不能恢复若干个原棒。但这样枚

继续微笑lsj 2574

[搜索] ZOJ1002、ZOJ1008、ZOJ1019、POJ1011

#include<iostream> #include<vector> #include<cstdio> #include<algorithm> using namespace std; struct grid { int bot,top,left,right; grid(int b=0,int t=0,int l=0,int r=0):bot(b),top(t),left(l),right(r){} bool operator==(const grid& other)const { retu

a83610312的专栏 1335

Poj 1011-Sticks

Poj 1011-Sticks   题意:有n根木棍(n 分析:这题不愧是经典中的经典,很早之前就写过,先后2次都没写出来,然后就放了一段时间,这是第三次了,终于写出来了。 基本思路是我们计算出出所有的木棍长度的长度和sum,从小到大枚举它的约数,找到第一个可行解就行了。 具体实现的话:首先,木棍有64根,搜索树是非常巨大的,如果不加任何剪枝,程序根本运行不出来,所以必须进行剪枝。 之

我的ACM,我的梦!!! 1003

POJ - 1011 Sticks (Java)

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were originally. Please help hi

昔年 ~ 不忆的博客 450

poj - 1011 Sticks

题目也挺难懂的,要仔细审题,其实就是一句话搞定的意思:把一组数组合成所有数值相等的一组新的数列。 看她题目说了一大堆: Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to

靖空间 992
上一篇: 1026. Table Tennis (30)-PAT
下一篇: 1010-Tempter of the Bone -HDUOJ
zoushidexing
博客等级 码龄18年 70粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值