题目来源:蓝桥杯算法训练
知识点:搜索

问题描述
  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.
输入格式
  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.
输出格式
  The output should contains the smallest possible length of original sticks, one per line.
样例输入
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
样例输出
6
5

题目分析

本题的要求是:将多根短木棍合并为若干个等长的长木棍,且长木棍的长度要最小。

这里是我的一点心得:关于数据问题大概率是从数据的特殊值出发去考虑的,如最值、均值、和、差、乘积等等。通过思考,我们可以发现这道题与有关系。

虽然不知道原来等长的木棍的长度,但是它们长度的和是可以知道的,就是所有木棍长度的总和。那么,原来的木棍的长度乘上木棍的数量就恰好等于长度之和。因此,可以从和的因数下手,最小的且符合要求的因数就是所求。

在给出的所有短木棍中,最大值有可能就是和的因数,且就是最小的原长度。因此,对和的因数的搜索范围可以定位为:短木棍最大值 ~ 和的一半。对于只有一根木棍的情况比较简单,可以单独处理。对因数从小到大进行搜索,一旦当前的因数能由短木棍构成,且是多个等长的,那么我们就找到了答案。

对输入的长度从大到小进行排序。在搜索时从头到尾取木棍进行拼接,这里有几种需要剪枝(即停止当前搜索)的情况:

  1. 当前这根棍子用过了。
  2. 当前这根棍子跟上一根长度相同,但是上一根没用过(因为排序了,所以可以这样)。
  3. 当前已经拼出了一根按照要求长度的木棍,但是后面剩下的棍子拼不出这种长度的木棍。
  4. 拼接当前的棍子,长度还不够要求,但是所剩的棍子拼不出要求的长度。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 65;
int len[N];
int vis[N];
int n, flag, sum, num;bool cmp(int a, int b) {if(a > b) return true;else return false;
}bool dfs(int s, int cur, int cnt, int k) {//s:当前已拼凑的长度, cur:开始位置, cnt:已拼凑的数目, k:单根木棍长度if(cnt == num) {//拼凑成功return true; } for(int i=cur; i<n; i++) {if(vis[i] || (i && len[i] == len[i-1] && !vis[i-1])) {//使用过 或者 与上一根没用上的棍子长度相同,剪枝continue; }if(len[i] + s == k) {//拼出一根vis[i] = 1;if(dfs(0, 0, cnt + 1, k)) {//继续拼下一根,且成功返回 return true;} //后面剩余的棍子无法拼成长度为 k的木棍,提前结束 vis[i] = 0;return false;}if(len[i] + s < k) {//没拼完vis[i] = 1;if(dfs(len[i]+s, i+1, cnt, k)) {//能成功拼完return true; } vis[i] = 0;//无法拼成if(!s) return false; }}return false;
}int main() {while(cin >> n && n != 0) {sum = 0;for(int i=0; i<n; i++) {cin >> len[i];sum += len[i];}//从大到小排序sort(len, len + n, cmp); //开始处理flag = 0; //有解标志// 长度从小到大检查 for(int i=len[0]; i<=sum/2; i++) {if(sum % i == 0) {memset(vis, 0, sizeof(vis));num = sum / i; //棍子数量if(dfs(0, 0, 0, i)) {cout << i << endl;flag = 1;break;} }} if(!flag) cout << sum << endl;}return 0;
}

本文参考自:https://www.cnblogs.com/wwj321/p/12326398.html

蓝桥杯——Sticks (C++)相关推荐

  1. 蓝桥杯算法训练sticks

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀. 文章目录 题目 题解 数据传送阵 代码传送阵 题目 George took sticks of the same length and cut th ...

  2. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1004 无聊的逗 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-1004 无聊的逗 前言 关于数学的疑问 算法训练 无聊的 ...

  3. 十二届蓝桥杯省赛B组C++解析(填空题部分)

    十二届蓝桥杯省赛B组C++解析(填空题部分) 目录 十二届蓝桥杯省赛B组C++解析(填空题部分) A:空间 B:卡片 C:直线 D:货物摆放 E:路径 A:空间 该题是一道计算机基础原理题,这里需要了 ...

  4. 关于python的比赛_【蓝桥杯】——python集团的比赛技巧,Python,组

    [蓝桥杯]-- Python组比赛技巧 蓝桥杯是大学生IT学科赛事,由工业和信息化部人才交流中心主办,所以对于大学生还说还是非常值得去参加的,2020年第十一届蓝桥杯新增了大学Python组,不分组别 ...

  5. 【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布

    题目 1481:剪刀石头布 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写程序实现&q ...

  6. 【蓝桥杯】【入门题】【算法提高VIP】1480:模拟计算器

    题目 1480:模拟计算器 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 使用Switch ...

  7. 题目 1477:【蓝桥杯】【入门题】字符串输入输出函数

    题目 1477:字符串输入输出函数 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写函数 ...

  8. 题目 1471:【蓝桥杯】【入门题】【基础练习VIP】矩形面积交

    题目 1471:矩形面积交 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 平面上有两个矩形 ...

  9. 题目 1093:【蓝桥杯】【入门题】字符逆序

    题目 1093:字符逆序 蓝桥杯刷题群已成立,微信后台回复[蓝桥杯],即可进入. 如果加入了之前的社群不需要重复加入. 时间限制: 1Sec 内存限制: 64MB 1. 题目描述 将一个字符串str的 ...

最新文章

  1. NSCache和NSURLCache网络缓存优化
  2. matlab vco,MATLAB锁相环仿真程序求解
  3. 源字符集与执行字符集
  4. 回归分析和卡方检验的区别_11个常见的多变量分析方法
  5. 2440 休眠唤醒的实现过程(作者:wogoyixikexie@gliet)
  6. java dateTime + long
  7. spring管理的类如何调用非spring管理的类
  8. Mybatis源码研究5:数据源的实现
  9. 【华为云实战开发】12.如何在云端快速开展Swagger接口测试
  10. [Flex]Flex 3.0 and Adobe AIR 1.0正式版发布!
  11. 品优购-01分布式框架-Dubbox
  12. 微信小程序笔记——滚动计数器
  13. 我对顶级域名、一级域名和二级域名的认识
  14. 【下载工具】哔哩哔哩视频下载器——(Downkyi)下载姬v1.3.3
  15. Win10下配置PHP环境变量
  16. 我的2017——作为一名程序员,我重新思考了我生活的目标
  17. 示波器如何设置实现单次触发
  18. 如何删除PDF文档中的某一页
  19. IntelliJ IDE
  20. Java代码简洁-validation参数校验

热门文章

  1. oracle序时账是什么,序时账和明细账到底有什么区别
  2. 同一个always块中,变量多次赋值问题
  3. QObject对象的析构
  4. Bootstrap笔记(十六) 常用类别 - 显示层级与隐藏元素
  5. iconfont添加新图标_添加自定义图标(iconfont)
  6. 网吧万能克隆系统的制作
  7. SM5203高输入18V耐压单节锂电池线性充电芯片
  8. apache camle template , Adding Routes dynamically
  9. 远程控制电脑软件VNC安装使用教程:Windows系统
  10. 超级计算机 更深的蓝 是什么,计算机“更深的蓝”具有智能吗