题目描述

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过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的更多相关文章

  1. POJ1011 木棒(dfs+剪枝)

    问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始 ...

  2. poj1011 Sticks[剪枝题]

    https://vjudge.net/problem/POJ-1011 此题很重要.★★★ 很欢(e)乐(xin)的一道搜索剪枝题..poj数据还是太水了,我后来想不出来剪枝方法了,就加了句掐了时间语 ...

  3. poj1011 Sticks (搜索经典好题)

    poj1011 Sticks 题目连接: poj1011 Description George took sticks of the same length and cut them randomly ...

  4. 北大poj-1011

    木棒 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 136132   Accepted: 32036 Description ...

  5. 【poj1011】 Sticks

    http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...

  6. POJ1011

    今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id ...

  7. POJ1011 Sticks

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  8. POJ1011 (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 129606   Accepted: 30388 Descrip ...

  9. Sticks(poj1011/uva307)

    题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...

随机推荐

  1. 关系型数据库和非关系型数据库区别、oracle与mysql的区别

    一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库.    关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐 ...

  2. 【Linux】【Services】【SaaS】Docker+kubernetes(1. 基础概念与架构图)

    1.简介 1.1.  背景:公司正在进行敏捷开发环境的搭建,以取代传统的架构,好处大大的,我就不赘述了.公司原来负责这个项目的同事要转组,我只好交给另外同事继续,但是为了防止同样的事情,我也需要深入了 ...

  3. 注解开发中的@Results注解使用

    package com.hope.dao;import com.hope.domain.User;import com.sun.xml.internal.bind.v2.model.core.ID;i ...

  4. Salesforce LWC学习(三十七) Promise解决progress-indicator的小问题

    本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-progress-indicator/exa ...

  5. 并行Louvain社区检测算法

    因为在我最近的科研中需要用到分布式的社区检测(也称为图聚类(graph clustering))算法,专门去查找了相关文献对其进行了学习.下面我们就以这篇论文IPDPS2018的文章[1]为例介绍并行 ...

  6. Mysql配置文件 扩展详细配置

    目录 配置文件中有些特定参数 扩展配置 max_connections connect_timeout interactive_timeout|wait_timeout net_retry_count ...

  7. 新一代Java程序员必学的Docker容器化技术基础篇

    Docker概述 **本人博客网站 **IT小神 www.itxiaoshen.com Docker文档官网 Docker是一个用于开发.发布和运行应用程序的开放平台.Docker使您能够将应用程序与 ...

  8. [BUUCTF]PWN10——[第五空间2019 决赛]PWN5

    [第五空间2019 决赛]PWN5 题目网址:https://buuoj.cn/challenges#[第五空间2019%20决赛]PWN5 步骤: 例行检查,32位,开启了nx和canary(栈保护 ...

  9. 静态日志框架Extensioner.Logging

    静态日志框架,输出文本文件,基于log4net扩展,轻量,方便,无侵入! 使用方法 执行Install-Package Extensioner.Logging -Version 2.0.0导入Nuge ...

  10. 解决Xshell 连接Linux 窗口不活动会自动断开连接

    修改linux服务器ssh断开时间  修改profile配置 vim /etc/profile 增加配置  后面单位秒 这里就是三分钟不活动断开连接 TMOUT=180 然后使用 wq! 进行保存,使 ...