木棒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 ...
随机推荐
- mybatis中返回自动生成的id
当有时我们插入一条数据时,由于id很可能是自动生成的,如果我们想要返回这条刚插入的id怎么办呢. 在mysql数据中我们可以在insert下添加一个selectKey用以指定返回的类型和值: ...
- eclipse.ini配置 vmargs 说明
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数, ...
- MySQL记录锁、间隙锁、临键锁小案例演示
生成间隙(gap)锁.临键(next-key)锁的前提条件 是在 RR 隔离级别下. 有关Mysql记录锁.间隙(gap)锁.临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文 ...
- [BUUCTF]REVERSE——[WUSTCTF2020]level1
[WUSTCTF2020]level1 附件 步骤: 下载下来的附件有两个,output.txt里是一堆数字 64位ida打开第一个附件,检索字符串,发现了flag字样 双击跟进,ctrl+x交叉引用 ...
- 再识ret2syscall
当初学rop学到的ret2syscall,对int 0x80中断了解还不是很深,这次又复习了一遍.虽然很简单,但是还是学到了新东西.那么我们就从ret2syscall开始吧. IDA一打开的时候,就看 ...
- [BUUCTF]PWN10——[第五空间2019 决赛]PWN5
[第五空间2019 决赛]PWN5 题目网址:https://buuoj.cn/challenges#[第五空间2019%20决赛]PWN5 步骤: 例行检查,32位,开启了nx和canary(栈保护 ...
- MM函数(Excel函数集团)
此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
- Linux(Centos)内存占用过高处理
查看内存占用最大 ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' 命令查看占用内存最大的10个进程 ...
- 一个在线MP4提取mp3的网站
网址 https://airmore.cn/extract-audio-online