2021哔哩哔哩1024程序员节日第一弹:算法与安全

前两天参加了哔哩哔哩1024程序员节活动,看到了几个有意思的算法题,分享一下。(文末有全部答案)

1.蚂蚁爬木杆

在这里插入图片描述

有一根长27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂
蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或
调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以
走一厘米的距离,求所有蚂蚁都离开木杆的最短时间和最长时间。(本题由UP主@IT私塾提供)

解题思路:

我们可以这么想,在相遇时,两只蚂蚁可以穿过对方的身体,只不过是交换了身份而已,即把A看作B,B看作A,即他们仍朝各自的方向行走,而互不受影响。那么从远端出去是花费时间最长的,从近端出去是花费时间最短的;所有蚂蚁都从远端离开其中花费时间最长的是题中求的最长时间,所有蚂蚁都从近端离开其中花费时间最长的是题目求的最短时间。

在这里插入图片描述

sticklength = 27    # 木棍长度
antnum = 5      # 蚂蚁数量
position = [3, 7, 11, 17, 23]   # 蚂蚁位置
speed = 1   # 速度

max = 0   # 最长时间
min = 0  # 最短时间
tmp_max = 0
tmp_min = 0

for p in position:
    if p < (sticklength/2):   # 木棍左半边
        tmp_max = (sticklength-p) / speed
        tmp_min = p / speed
    else:   # 木棍右半边
        tmp_max = p / speed
        tmp_min = (sticklength - p) / speed

    if max < tmp_max:
        max = tmp_max
    if min < tmp_min:
        min = tmp_min

print("max: {0}, min: {1}".format(max, min))

max: 24.0, min: 11.0

2.爬台阶

在这里插入图片描述

一个小孩练习爬台阶,一共10级台阶,小孩可以一次向上选择爬1-3级。但是第3级和第6级台阶被施加
了魔法,小孩一旦踏上就会停下来就开始跳《新宝岛》。那么,不让小孩跳《新宝岛》的爬法一共有多
少种?(本题由UP主@魔法小分队队长提供)

解题思路:

可以利用递推法,要想到第10层有三种办法,从第9层向上爬1层、从第8层向上爬2层、从第7层向上爬3层,依此类推,有公式:fx = fx-1 + fx-2 + fx-3,但要注意避开第3层和第6层。也就是说f9 = f8+f7+0,因为不能踏上f6。

def f(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3 or n == 6:
        return 0
    if n > 3:
        return f(n-1)+f(n-2)+f(n-3)

print(f(10))

42

3.中位数

在这里插入图片描述

现有5个元素,它们各不相同,且两两之间可比较。我们可以通过反复比较两个元素的大小,来找出5个元素中的中位数。请问最少用多少次比较,可以确保总能找到 5个元素的中位数?(本题由UP主@算法主义提供)

在这里插入图片描述

4.香钟

在这里插入图片描述

香钟(又名火绳钟)是一种使用燃烧香计时的方法,采用榆树皮粉加入少量秸秆和自然元素,配合一定比例的水搅拌均匀后倒模制成香,根据倒模出不同长度、粗细的香,经过燃烧测量可以生产出各种单位时间的计时香,例如辰香(2小时),刻香(15分钟)等。土堡会战中,上将军安排左右前卫营于丑时出发,约定出发后5刻(1小时15分)分别从敌人大本营西侧与北侧奇袭敌营。营中刻香由于保管不当尽毁,目前营中只有辰香,且辰香不能折断也无法均匀分割,作为左前卫营行军参谋的你要拿出具体的计时方案。请问要想确定出5刻的时长,至少需要多少根辰香?(本题由UP主@黑马程序员提供)

答案:
一共需要四根,记为a、b、c、d。
首先,a两端同时点燃,bc一端点燃,等到a燃尽;
然后,b点燃另一端,d点燃一端,等b燃尽;
最后,点燃c另一端,等c燃尽,d剩下的就是5刻。

5.吃烤鸭

在这里插入图片描述

期末考试结束了,老师决定带学生们去卷饼店吃烤鸭饼。老师看到大饼和鸭子,搞了一个活动:每人可以拿走一张饼,谁卷到的食物美味程度总和最高,谁就能获得称号:卷王之王!Vita很想得到“卷王之王”称号,他的大饼可以装下大小总和不超过500的食物,现在有7块鸭肉和6根黄瓜,每份食物都有它的大小和美味程度。每块鸭肉的大小:85、86、73、66、114、51、99 每块鸭肉的美味程度:71、103、44、87、112、78、36 每根黄瓜的大小:35、44、27、41、65、38 每块黄瓜的美味程度:41、46、13、74、71、27 老师要求大饼里至少有一块鸭肉和一根黄瓜。请问,Vita卷到的食物美味程度总和最大是多少?(本题由UP主@小学生Vita君提供)

解题思路:
这道题我是用性价比法做的,先统计一下数据,计算出性价比,按性价比选择,最后微调。

在这里插入图片描述
按照性价比由高到低排列:
在这里插入图片描述
我们先把性价比高的选了,【瓜4+肉6+肉4+肉2+瓜1+瓜5+瓜2】这里重量是388,轮到鸭肉5时,重量为502刚好超出500限制,但鸭肉5美味度112我们肯定要选它,所以选【瓜4+肉6+肉4+肉2+瓜1+肉5】,这里重量393。再从剩下的里面选性价比高的黄瓜5,这是重量是458,在选一个黄瓜6,重量496。

最终答案【瓜4+肉6+肉4+肉2+瓜1+肉5+瓜5+瓜6】重量496,美味度593。

6.报30

在这里插入图片描述

半仙君和粉丝两人打赌,每人喊1-3中的一个数,谁先喊到30谁赢,请问先喊几有稳赢的可能性?(本题由UP主@半仙君_提供)

解题思路:

跟第二题,小孩在魔法台阶上练《新宝岛》一样,递推。
fx=fx-1 + fx-2 + fx-3,谁先喊道30谁赢,所以要抢喊26,这样对方再喊破喉咙也不可能一次喊到30,依此类推,要想喊26就要抢喊22,依此类推18,14,10,6,2,所以开始喊2赢得几率大。

7.老鼠吃毒药

在这里插入图片描述

共有n瓶药和4个老鼠,其中只有一瓶毒药,老鼠吃了1天就挂了,现在仅有1天的时间让你找出毒药,请问n最多等于几?(本题由UP主@半仙君_提供)

解题思路:
将瓶子的数量转换为二进制数,然后让第1只老鼠喝掉所有二进制数右起第一位是1的瓶子,让第2只老鼠喝掉所有二进制数右起第二位是1的瓶子,依此类推。一天后,如果第2只老鼠没死,就知道毒药瓶子的二进制编号中,右起第二位是0…,每只老鼠的死活都能确定出二进制数的其中一位,由此便可知道毒药瓶子的编号了,如果都没死,那么就是0号瓶子。

在这里插入图片描述

更多内容请关注公众号【李哥技术笔记】,回复1024,下载完整版答案

免费分享超过1000本计算机类电子书,包含编程语言、大数据、机器学习、校招面试经验等
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值