木棒poj1011
题目描述
乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。
然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。
请你设计一个程序,帮助乔治计算木棒的可能最小长度。
每一节木棍的长度都用大于零的整数表示。
输入格式
输入包含多组数据,每组数据包括两行。
第一行是一个不超过64的整数,表示砍断之后共有多少节木棍。
第二行是截断以后,所得到的各节木棍的长度。
在最后一组数据之后,是一个零。
输出格式
为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。
题目分析
首先,看到最小,一定会想到二分,然后,用dfs为check函数,进一步,我们就要找到l,r,r明显是所有的值,但是l是什么,于是,只能暴力跑来,终点应该是和,而起点应该是1,但是,<最大的值的i,肯定是不行的,于是,起点可以改为最大值
dfs部分也很简单,设立一个当前值,如果>枚举的长度,就说明一定不行,一直到最后,如果没有return 0,就可以return 1,这样的时间复杂度为n!*n,64!一定会超时间,于是,便需要剪枝
题目要求,每个木棍如果超50不会进入计算
1,为了早点判断出是否可行,我们可以从大到小排个序,如果不行,return 0就能早一点,就像把一瓶一瓶的水放进水桶,水越多,越早溢出
2.如果,这根小木棍无法成功,说明,这个长度的小木棍都不行,有点记忆化的感觉
3.如果当前的木棍长度为零,且无法再次拼接,那就说明,肯定不行,如果一根小木棍不行,那莫,在剩余的木棍中,这个小木棍都是不行的,
4.如果,当前木棍无法拼接,且正好填满,说明,后面的都不行,贪心易证
#include <bits/stdc++.h>
using namespace std;
int n;
int cnt=0;
struct edge {
int val;
} a[10005];
int gs;
int x;
bool cmp(edge x, edge y) { return x.val > y.val; }
int vis[10005];
bool dfs(int x, int cd, int sg, int zz) {
if (x == gs+1) {
return 1;
}
if (cd == zz) {
return dfs(x + 1, 0, 1, zz);
}
int pd = 0;
for (int i = sg; i <= cnt; i++) {//不能是n
if (pd == a[i].val) {
continue;
}
if (vis[i]) {
continue;
}
if (cd + a[i].val > zz) {
continue;
}
vis[i] = 1;
if (dfs(x, cd + a[i].val, i + 1, zz)) {
return 1;
}
vis[i] = 0;
pd = a[i].val;
if (cd == 0 || cd + a[i].val == zz) {
return 0;
}
}
return 0;
}
int main() {
while (~scanf("%d", &n)) {
if (n == 0) {
return 0;
}
int sum = 0;
cnt=0;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
if(x>50)
{
continue;
}
a[++cnt].val=x;
sum += a[cnt].val;//易错
}
sort(a + 1, a + 1 + cnt, cmp);
for (int i = a[1].val; i <= sum; i++) {
if (sum % i == 0) {
gs = sum / i;
memset(vis, 0, sizeof(vis));
if (dfs(1, 0, 1, i)) {
printf("%d\n", i);
break;
}
}
}
}
}
木棒poj1011的更多相关文章
- POJ1011 木棒(dfs+剪枝)
问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始 ...
- poj1011 Sticks[剪枝题]
https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...
- poj1011 Sticks (搜索经典好题)
poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly ...
- 北大poj-1011
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 136132 Accepted: 32036 Description ...
- 【poj1011】 Sticks
http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...
- POJ1011
今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id ...
- POJ1011 Sticks
Description George took sticks of the same length and cut them randomly until all parts became at mo ...
- POJ1011 (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 129606 Accepted: 30388 Descrip ...
- Sticks(poj1011/uva307)
题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...
随机推荐
- HashMap 和 HashSet
对于HashSet而言,系统采用Hash算法决定集合元素的存储位置,这样可以保证快速存取集合元素: 对于HashMap,系统将value当成key的附属,系统根据Hash算法来决定key的存储位置,这 ...
- js处理title超长问题
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- shell条件测试语句实例-测试apache是否开启
终于理解了shell条件测试语句"!="和"-n"的用法区别,于是有了如下的shell脚本,做为练习. 第一种方法:测试apache是否开启?字符串测试 #!/ ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(3. 用ansible管理机器和软件)
1. 简介 1.1. 公司环境使用的puppet,但是我更喜欢ansible,原因有二,第一,我是红帽的忠粉:),第二,我对python比较熟悉 1.2. ansible官方网站:https://ww ...
- 【Linux】【Basis】【RHEL】KickStart for RHEL6.8
1. 概念: 自动安装的脚本,这篇文章以RHEL6.8为例 kickstart for RHEL6.8官方教程:https://access.redhat.com/documentation/en-U ...
- SpringBoot 项目不加载 application.properties 配置文件
起因:新安装的idea第一次运行springboot项目报url错误(Failed to configure a DataSource: 'url' attribute is not specifie ...
- MFC入门示例之静态文本框、编辑框
点击按钮计算文本框中文本长度 void CMFCApplication1Dlg::OnBnClickedButton1() { CString strInput; GetDlgItemText(IDC ...
- Springboot集成velocity
1.加入maven包 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- vivo浏览器的快速开发平台实践-总览篇
一.什么是快速开发平台 快速开发平台,顾名思义就是可以使得开发更为快速的开发平台,是提高团队开发效率的生产力工具.近一两年,国内很多公司越来越注重研发效能的度量和提升,基于软件开发的特点,覆盖管理和优 ...
- Nginx模块之Nginx-echo
目录 一.简介 二.使用 一.简介 官网 Nginx-echo可以在Nginx中用来输出一些信息,是在测试排错过程中一个比较好的工具.它也可以做到把来自不同链接地址的信息进行一个汇总输出.总之能用起来 ...