牛客网
poj 1011

题目:

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

题意:

一组等长木棍,砍成n份,现将n份重新组合,问原木棍的长度

题解:

dfs+剪枝
思路就是枚举每一种长度的可能,然后去验证是否成立
如果直接这样做肯定超时,我们需要优化,也就是剪枝
1.将原木棍的长度从小到大排列,并按照这个顺序进行搜索,原木棍的长度肯定在1~所有木棍之和范围内,也大于等于现所有木棍
2.如果我们探究第x个木块是否能匹配,如果与第i个木棍不能拼成假设长度,则和第i个木棍一样长的都不可以,这样可以跳过一批
3。如果对于一个木棍,找不到任何一个或多个木棍拼成预设原木棍长度,那说明该预设原木棍长度不存在,枚举下一个
对应代码部分就是

 if(ret==a[i] || len==ret)break;

我是这么理解的:
ret = = a[i]表示可以与a[i],但是之后的木棍无法拼上,依旧不符合题意
len = = ret说明之后的任何一个木棍都拼不上

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int sum,a[100];
bool vis[100];
bool cmp(int a,int b){return a>b;
}
int dfs(int len,int n,int stick,int ret)
{if(stick==n && ret==0)//ret是代表的是以及一个棒已经拼的长度的return len;//如果所有的棒都已经用完的话 if(ret==0)//这代表一个已经拼完啦!ret=len;int i;for(i=0; i<n; i++){if(vis[i]==true)continue;if(a[i]>ret)continue;//代表的是已经不满足题意了,直接要跳出大循环的vis[i]=true;if(dfs(len,n,stick+1,ret-a[i])) //如果当前木棍与其他木棍拼成功 return len;vis[i]=false; if(ret==a[i] || len==ret)//最重要的剪枝,如果找不到任意一个枝和当前的枝进行匹配,则说明不可能对了,就直接跳出大循环的!break;while(a[i]==a[i+1])//剪枝二,dfs的木块与第i根没有拼成的话,第i+1根和第i根长度相同的话也就拼不成了,剪去的{printf("a[i]=%d,ret=%d,len=%d\n",a[i],ret,len);i++;}}return 0;
}
int main()
{int i,j,n,k;while(1){cin>>n;if(n==0)break;sum=0;for(i=0; i<n; i++){cin>>a[i];sum+=a[i];}sort(a,a+n,cmp);//剪枝一,按照棍子从大到小排列的,然后直接舍弃总棍子太小的for(i=a[n]; i<=sum; i++){if(sum%i!=0)continue;//本来就不可以的啊memset(vis,0,sizeof(vis));k=dfs(i,n,0,i);//预设原木棍长度(固定的)  木棍总块数   所用木棍的数量   还需要拼的长度(不断变化) if(k!=0)break;}cout<<k<<endl;}return 0;
}

另外 sort与qsort:

qosrt和sort我一直认为是qsort快,但也有说sort快的,我也是一脸懵逼

int num[maxn];int cmp ( const void *a , const void *b )
{ return *(int *)a - *(int *)b;}qsort(num,maxn,sizeof(int),cmp);

Poj 1011 UVA - 307 Sticks相关推荐

  1. UVA 307 Sticks

    UVA_307 相当于重温了一下POJ 1011这个题目,剪枝在这个题目中显得尤为重要. 对于这道题而言,剪枝的策略一般有下面6个: ①先将木棒长度从大到小进行排序,这样便于后面的选择和操作,是后面一 ...

  2. POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)

    Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...

  3. Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)

    题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit     3000 ms OS     Linux George took sticks of the sam ...

  4. poj 1011 Sticks 搜索

    发一道老早写的题. 1 #include<iostream> 2 #include <algorithm> 3 using namespace std; 4 int a[65] ...

  5. POJ - 1011 Sticks(dfs+剪枝)(好题!!)

    题目链接:点击查看 题目大意:乔治拿来一组等长的木棍,将他们随机砍断,使得每一节木棍的长度都不超过50个单位长度,然后他又想将这些木棍恢复成砍断之前的状态,但他忘记了初始时有多少根木棍以及木棍的初始长 ...

  6. POJ 1011 Sticks

    POJ_1011 做完这个题目,让我不仅学到了一些别人剪枝的策略,更重要的是让我意识到了在搜索中剪枝的重要性. 所谓剪枝,其实就是对程序的优化,尽可能地避免程序执行无用的操作.就这个题目而言,程序的优 ...

  7. Poj 1011:sticks通俗易懂 大法师+强力剪枝

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

  8. 木棒,POJ(1011)

    题目链接:http://poj.org/problem?id=1011 解题报告: #include <cstdio> #include <cstring> #include ...

  9. poj 1264 || UVA 109 SCUD Busters

    UVA这题过得蛮多人的,觉得应该是个水题吧. 一读题,也不麻烦,给你N个王国,求下凸包,再求面积.给你一些炮弹,问炮弹炸掉的面积.(一个炮弹炸的话,整个王国都被炸了). 直接求凸包后,求出各个王国的面 ...

最新文章

  1. java导出highcharts_java实现highcharts导出图片至excel
  2. linux 虚拟机不能启动不了系统,虚拟机更改linux初始启动5,出现无法启动现象
  3. PAT甲级1012 The Best Rank :[C++题解]4个成绩取排名最低:排序、二分(好题)
  4. P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)
  5. java判断手机号_java使用正则表达式判断手机号的方法示例
  6. C语言中quot;##quot;的独特用法
  7. python入口函数的作用_python之函数中参数的作用域
  8. Django/Flask/Tornado三大web框架性能分析
  9. centos7 docker删除端口映射_centos7安装docker,结合docker安装mysql,学习简单使用
  10. 春招快到了,送你一份数据分析常见面试题
  11. 鸿蒙系统的升级名单,定档6月2日!鸿蒙“首批”升级名单公布,共计11款华为机型!...
  12. php rest api lumen,使用Lumen框架创建 REST API 实例教程
  13. sublime Text3安装可以使xml格式化的插件
  14. 给apk去签名、重新签名
  15. matlab识别水雷岩石,基于MATLAB的微弱信号检测方法仿真分析
  16. 深入理解设计模式-设计模式七大原则
  17. 堆漏洞挖掘中的Chunk分类(allocated chunk、free chunk、top chunk、last remainder chunk)
  18. FCC Advanced Algorithm Scripting
  19. 分析11.2.0.3 rac CRS-1714:Unable to discover any voting files
  20. 推荐程序员面试秘籍!抖音Java后端123面开挂,太牛了!

热门文章

  1. PCA主成分分析+SVM实现人脸识别
  2. 马化腾最崇拜的作家吴晓波《历代经济变革得失》读书笔记
  3. aix 安装oracle9,IBM P570 小型机AIX5.3系统安装ORACLE9i
  4. python怎么获取lol皮肤名称_LOL手游免费皮肤获得方法 LOL手游皮肤怎么获得
  5. headless 怎么处理_公司清算注销债务怎么处理
  6. linux创建备用管理员,sql server 创建备用管理员和只读用户
  7. 在c语言中如何屏蔽一段程序,如何在用C语言关闭TCP程序中的Nagle算法
  8. java导入导出excel_Java导入导出Excel工具 easyexcel
  9. 开线程插数据_python笔记7-多线程之线程同步(锁lock)
  10. thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评