题目链接

题目

题目描述

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

输入描述

第一行为一个单独的整数N表示砍过以后的小木棍的总数。第二行为N个用空格隔开的正整数,表示N根小木棍的长度。

输出描述

输出仅一行,表示要求的原始木棍的最小可能长度。

示例1

输入

9
5 2 1 5 2 1 5 2 1

输出

6

备注

\(1 \leq N \leq 60\)

题解

知识点:DFS。

首先要枚举一个原长,再去dfs可行性,但这题关键在于剪枝。

优化:

  1. 原长要整除长度和
  2. 木棍从大到小排序,方便快速剪枝
  3. 访问过的木棍不再访问
  4. 拿取后长度超额的木棍不搜索
  5. 每次拼凑一根原棍从上一次访问的木棍之后开始,因为之前的都已经不可行了
  6. 一次失败后,后面全部相同长度的不要搜索
  7. 第一根或者最后一根失败代表上一根也失败直接跳出循环

以上优化缺一不可。

时间复杂度 \(O(?)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int n, a[67];
int len;
bool vis[67]; bool dfs(int step = 0, int sum = 0, int pos = 0) {
if (sum == len) {
if (step == n) return true;
else sum = 0, pos = 0;
}
for (int i = pos;i < n;i++) {
if (vis[i] || sum + a[i] > len || i > 0 && a[i - 1] == a[i] && !vis[i - 1]) continue;
vis[i] = 1;
if (dfs(step + 1, sum + a[i], i + 1)) return true;
vis[i] = 0;
if (!sum || sum + a[i] == len) break;
}
return false;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
int sum = 0;
for (int i = 0;i < n;i++) cin >> a[i], sum += a[i];
sort(a, a + n, [&](int a, int b) {return a > b;});
for (len = a[0];len <= sum;len++) {
if (sum % len) continue;
if (dfs()) {
cout << len << '\n';
break;
}
}
return 0;
}

NC50243 小木棍的更多相关文章

  1. 洛谷P1120小木棍[DFS]

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

  2. 小木棍 (codevs 3498)题解

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

  3. 洛谷P1120 小木棍

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

  4. P1120 小木棍 [数据加强版] 回溯法 终极剪枝

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

  5. 洛谷 P1120 小木棍 [数据加强版]解题报告

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

  6. 题解 P1120 【小木棍 [数据加强版]】

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

  7. [Luogu P1120]小木棍·加强版

    #\(\mathcal{Description}\) 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 \(50\) . 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开 ...

  8. P1120 小木棍 [数据加强版]

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

  9. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  10. P1120 小木棍 [数据加强版](poj 1011)

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

随机推荐

  1. Redis 哨兵模式高可用

    本文为博主原创,未经允许不得转载: 目录: 1. 哨兵 Sentinel 介绍 2. 哨兵架构特点及工作原理 3. redis哨兵架构搭建步骤 4. 哨兵数据丢失 5. spring boot 整合  ...

  2. 基于AHB_BUS的eflash控制器设计-02

    基于AHB-BUS的eflash控制器设计 1.Flash Spec 1.1 地址映射 XADR是10bit?因为一共有1024行 每一行128byte容量,每次读取的粒度就是一个double wor ...

  3. 【SHELL】查找文件并删除

    find . -iname file-name |xargs -I % rm -rf %

  4. 2023第十四届极客大挑战 — RE WP

    RE方向出自:队友. Shiftjmp 去花后按p然后再反编译 最后flag为SYC{W3lc0me_tO_th3_r3veR5e_w0r1d~} 点击就送的逆向题 gcc 1.s -o 1` 生成e ...

  5. Python Code_06基础篇

    条件表达式 # coding:utf-8 # author : 写bug的盼盼 # development time : 2021/8/28 7:38 num_a = input('请输入第一个整数' ...

  6. [转帖]使用 TiUP 扩容缩容 TiDB 集群

    https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup TiDB 集群可以在不中断线上服务的情况下进行扩容和缩容. 本文介绍如何使用 ...

  7. [转帖]Docker容器无法访问网络问题(网段冲突)

    近日在使用docker在腾讯云服务器上部署项目 运行容器时死活访问不了网络,不论是外网还是内网. 最后找到原因是docker容器ip网段与服务器内网ip网段冲突导致的 使用此命令查看到 ifconfi ...

  8. [转帖]配置logback上报日志到Skywalking

    https://zhuanlan.zhihu.com/p/506119895 配置logback上报日志到Skywalking 配置logback上报日志到skywalking需要引入toolkit依 ...

  9. [1036]Linux启动时间分析

    简述 今天有同事咨询:项目上有台服务器操作系统启动时间较长,如何分析? 果然,好问题都来自实践. 经过查找,对于所有基于systemd的系统,可以使用systemd-analyze来分析系统启动时间. ...

  10. OpenGauss3.1.0 单机版安装部署过程

    背景 由易到难 先进行单节点的设置 先说坑 openEuler2203 默认安装了python3.9 但是openGauss里面指代了3.6和3.7 /openGauss/install/om 注意在 ...