问题:

假设要把长度为n厘米的木棒切分为1厘米长的小段,但是1根木棒只能由1人切分,当木棒被切分为3段后,可以同时由3个人分别切分木棒。求最多有m个人时,最少要切分几次。

譬如n=8,m=3时如下图所示,切分4次就可以了。

求当n=20,m=3时的最少切分次数。
求当n=100,m=5时的最少切分次数。

思路:

这道题最难的不是算法,而是理解题意。
木棒刚开始只有1根,题目规定“1根木棒只能由1人切分”,此时由1人切分后,变成2根;
2根木棒再做切分,也要满足“1根木棒只能由1人切分”的规则,所以此时由2个人,每人切1根,变成了4根;
随后,题目说“当木棒被切分为3段后,可以同时由3个人分别切分木棒”,也就是说,
当木棒根数达到上限人数后,每一次便只能切分出上限人数的根数了。
而在这之前,每次都有足够的人切木棒,每次也都是一分为二,木棒的数量都是翻倍递增

用文字来描述便是:

当前木棒数量 >= 人数上限时,新木棒数量 = 原有木棒数量 + 上限人数;
当前木棒数量 < 人数上限时,新木棒数量 = 原有木棒数量 * 2;
当新木棒数量大于等于木棒长度时,切分结束。

此题可以用递归和循环两种方法来解。

递归:

递归的结束条件便是current(当前的木棒数)>= n (木棒长度)。
当current (当前的木棒数)< m(人数上限)时,current = current * 2。
当current(当前的木棒数)>= m (人数上限)时,current = current + m;
每次递归时,就将当前木棒数通过参数传入下一次递归中,直至满足退出条件。

循环:

循环的结束条件与递归一样,也是当current(当前的木棒数)>= n (木棒长度)时退出,即是current < n时一直执行循环。
当current (当前的木棒数)< m(人数上限)时,current = current + current。
当current(当前的木棒数)>= m (人数上限)时,current = current + m;
每执行一次循环,count(循环计数,即切分次数)加1。

解答:

php

// 递归
// m 为上限人数
// n 为木棒长度
// current 为当前木棒数量
function cutBar($m, $n, $current)
{if ($current >= $n) {return 0;} elseif ($current < $m) {return 1 + cutBar($m, $n, $current * 2);} else {return 1 + cutBar($m, $n, $current + $m);}
}// 循环
function cutBar2($m, $n)
{$current = 1;// 初始木棒数$count = 0; // 切分计数while ($current < $n) {$current += $current < $m ? $current : $m;$count++;}return $count;
}$rs = cutBar(3, 8, 1);
echo $rs."\n";$rs = cutBar(3, 20, 1);
echo $rs."\n";$rs = cutBar(5, 100, 1);
echo $rs."\n";$rs = cutBar2(3, 8);
echo $rs."\n";$rs = cutBar2(3, 20);
echo $rs."\n";$rs = cutBar2(5, 100);
echo $rs."\n";

输出:

4
8
22
4
8
22

golang

package mainimport "fmt"func main() {rs := cutBar(3, 8, 1)fmt.Println(rs)rs = cutBar(3, 20, 1)fmt.Println(rs)rs = cutBar(5, 100, 1)fmt.Println(rs)rs = cutBar2(3, 8)fmt.Println(rs)rs = cutBar2(3, 20)fmt.Println(rs)rs = cutBar2(5, 100)fmt.Println(rs)
}func cutBar(m, n, current int) int {if current >= n {return 0} else if current < m {return 1 + cutBar(m, n, current*2)} else {return 1 + cutBar(m, n, current+m)}
}func cutBar2(m, n int) int {current := 1count := 0for current < n {if current < m {current += current} else {current += m}count++}return count
}

输出:

4
8
22
4
8
22

每周一道算法题005:切木棒相关推荐

  1. php电影推荐算法,每周一道算法题013:电影推荐

    问题: A.B.C三位用户都喜欢看电影,他们给自己所喜欢的电影类型打了如下的分: A B C 喜剧片 3 4 2 动作片 4 3 5 生活片 4 5 1 恐怖片 1 1 3 爱情片 4 5 1 B用户 ...

  2. 每周一道算法题003:翻牌

    问题: 有100张写着数字1-100的牌,并按顺序排列.最开始所有牌都是背面朝上放置.某人从第2张牌开始,隔1张牌翻牌.然后第2, 4, 6, -,100张牌就会变成正面朝上.接下来,另一个人从第3张 ...

  3. php判断一个数是否是回文数,每周一道算法题001:回文数

    题目: 找出大于10的最小的2进制,8进制,10进制都是回文数的最小的数.回文数指的是正读和反读都是一样的数,例如:33,10001,123454321... 思路: 先转换进制,然后统一处理成字符串 ...

  4. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  5. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  6. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

  7. 每天一道算法题系列十七之电话号码的字母组合

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...

  8. 搜狗2020秋招笔试的一道算法题

    搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...

  9. 每天一道算法题系列十二之整数转罗马数字

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...

最新文章

  1. Javascript使用Ajax跟踪历史
  2. LogMiner学习笔记
  3. 如何在 NET 程序万种死法中有效的生成 Dump (下)
  4. fusion构建器代码语法_构建器模式:适用于代码,适用于测试
  5. 更改密码 sp_password
  6. [js] 举例说明面向对象编程有什么缺点?
  7. rocketmq存储结构_RocketMQ消息存储
  8. html点击超链接出现弹窗,如何实现超链接弹窗打开
  9. 计算机科学理论数学研讨会,2017年奇异摄动理论及其应用学术研讨会会议-上海交通大学数学系.DOC...
  10. js实现农历时间代码
  11. 阅读笔记-HTTP返回状态码
  12. 如何成为一名产品经理?这是我自学产品的8个方法
  13. 萤石开放平台-定时获取AccessToken
  14. 世界最著名八大发动机结构!
  15. Python的字典中动态添加键值对
  16. 蓝旭前端第二周预习———HTML标签+如何查看控制台
  17. OkHttp调用第三方接口
  18. android 开机向导加载过程,Android开机向导构建流程
  19. HmacSHA1 STM32F4xx C语言实现
  20. 北斗短报文服务在通信中的应用

热门文章

  1. 「组装式开发」企业数字化转型的及时雨
  2. 当写博客成为一种习惯—CSDN Blog名列百强纪念
  3. <阅读>复杂系统的脆性理论及应用
  4. 人体姿态2019(八)Distribution-Aware Coordinate Representation for Human Pose Estimation
  5. 测试.net开源敏感词检测库ToolGood.Words
  6. 《读者》的“卷首语” (四)
  7. 如何利用 Electron 把网页变成桌面程序
  8. ROS限速、防syn、ip伪装、mac绑定、防火墙、屏蔽端口
  9. Apache服务器虚拟主机和别名配置及问题
  10. “易燃易爆炸”的零食产业该如何“控温”?