2021-05-29 国赛蓝桥杯第五题-孙悟空点金箍棒。


一、题目:

说孙悟空变出了多跟金箍棒,每根金箍棒的长度不一样。 他们叫互相吵闹。因此,悟空定住一根最长的金箍棒。其余的金箍棒变长。 直到所有金箍棒的长度一样长后才会和平相处。

样例如下:
输入 : [2,3,4]
过程1: [3,4,4]
过程2: [4,4,5]
输出 : [5,5,5]

二、解法

一(递归)

1.解题思路

利用递归方法,每次我们只定住最大值,其余的元素都+=1. 递归跳出条件是列表中的所有的元素都相等。

2.解题代码:

'''
_*_ coding: utf-8 _*_
@File    :   蓝桥杯国赛-孙悟空金箍棒.py
@Version :   1.0
@Author  :   Solar Lee
@Time    :   2021/05/29 14:22:45
Description:
孙悟空的金箍棒问题解决方法。
'''
import time


def equal_l(l: list) -> bool:  # 判断列表是否所有的元素都相等。
    for i in l:
        if i != l[0]:
            return False
    return True


def solution(l: list) -> list:
    global count
    n = max(l)
    max_index = l.index(n)
    if equal_l(l):
        print(f'孙悟空点击次数为:{count}次')
        return l
    else:
        for i in range(len(l)):
            if i != max_index:
                l[i] += 1
        print(l)
        count += 1
        solution(l)


if __name__ == '__main__':
    count = 0
    start_time = time.time()
    solution([2, 3, 4])
    end_time = time.time()
    print(end_time-start_time)


3. 运行结果:

输入:2 3 4
输出:孙悟空点击的次数为3次。每次进入递归都会打印出当前的列表状态。
在这里插入图片描述

二(数学简化版)

1.解题思路:

因为本题中只要求解孙悟空要点击的次数,我们不用每次的列表都求出来。 通过数学计算,这个问题可以简化得到孙悟空要点击的次数= 列表中的所有的数字都减去最小数字,在求和就可以了。

2.解题代码:

'''
_*_ coding: utf-8 _*_
@File    :   蓝桥杯国赛-孙悟空金箍棒.py
@Version :   1.0
@Author  :   Solar Lee
@Time    :   2021/05/29 14:22:45
Description:
孙悟空的金箍棒问题解决方法。
'''
import time


def solution(l: list) -> int:
    n = min(l)
    result = 0
    for i in l:
        result += i-n
    return result


if __name__ == '__main__':
    l = list(map(int, input().split()))
    start_time = time.time()
    print(f'孙悟空的点击次数为:{solution(l)}次')
    end_time = time.time()
    print(end_time-start_time)

3.运行结果:

输入:3 4 5
输出结果:孙悟空的点击次数为:3次.
注意: 这个解法是不会打印出列表状态。

三、 总结

  1. 本题用递归比较容易想出解法。 当然也可以用循环遍历来解决。但是时间复杂度和空间复杂度比较高。
  2. 本题用简单的数学方法可以大大简化代码,提高运行效率。
  3. 大家有兴趣可以测试下运行时间。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值