第五期青训「青训营 X 码上掘金」主题创作活动之寻友之旅&赞青豆 题目解析与代码实现

80 阅读4分钟

第五期青训「青训营 X 码上掘金」主题创作活动。

寻友之旅&赞青豆 题目解析与代码实现

2.jpg
当青训营遇上码上掘金,一切的奋斗都从这里出发!
借着疫情全面好转,钟南山院士为全国人民解除疫情下的盾牌的良机,在一位校友的推荐下,我报名来到了青训。用已经掌握的计算机语言,很快就完成了主题编程任务,接下来分享一下解题过程。


主题3:寻友之旅

这道题为定点判断计算问题。为简化题目,将小青和小码视为质点,由题目分析:

  1. 小青和小码的初始位置都由用户输入整数,具有一定的随机性;且小码的位置固定,由小青主动去寻找小码。
  2. 小青和小码家在一条直线上,无需考虑转弯等特殊情况;且两人的家之间间隔在0~100000个单位之间。
  3. 小青拥有的两种交通工具中,步行可以是一分钟前进或后退一个单位;乘公交则只能往一个方向行动2个单位。
  4. 需要求解用户任意输入两人位置后,计算出小青到小码家最短的时间消耗。
  5. 问题假设:
    (1)假设公交车只从一个方向出发后,永不回头及行驶行驶,即公交只能自起始位置0出发,一直行驶开往终点位置100000。
    (2)假设输入小码家位置大于小青家位置,则小青可以立即乘坐公交车前往小码家,且公交车和步行两种交通方式可以相结合。

image.png

编程思路及程序源代码:

    1. 在用户输入数据时,允许用户输入不合法数据后重复输入,则采用while循环控制;允许用户输入数据时按错空格等其它不合法字符,采用strip函数进行数据清洗。
  • 2.通过if-elif循环嵌套,将用户输入合法数据可能分为三种情况,依次进行计算。
  • 3.设计一个count标志位,控制循环的允许与终止;使用exit对程序进行结果可视化终止。
  • 4.代码实现:
print('主题 3:寻友之旅'.center(40,'*'))
count = 1
while count:
        N = float(input('输入一个整数N:').strip())
        M = float(input('输入一个整数M:').strip())
        if 100000>=N>M>=0:
            exit(f'小青到小码家所需的最短时间为{N-M}分钟')
            count = 0
        elif 0<=N<M<=100000:
            if (M-N)%2 ==0:
                exit(f'小青到小码家所需的最短时间为{(M - N)/2}分钟')
            else:
                exit(f'小青到小码家所需的最短时间为{((M - N-1) / 2)+1}分钟')
        elif 0 <= N == M <= 100000:
            exit('小青和小明在同一位置,小青到小码家所需的最短时间0分钟')
        else:
            print('输入数字不合法,请重新输入')
            count = 1

测试结果如下:

3.jpg

4.jpg

6.jpg

7.jpg


主题4: 攒青豆

这道题为“接雨滴”问题。 借用官方思路,假设右边界无限高,容易求得这种情况下的最大装水量,再假设左边界无限高,同样容易求得左边界情况下的最大装水量,事实上,这两种情况的交集,就是总的装水量,借用官方的思路图解。 image.png

编程思路及程序源代码:

    1. 在用户输入数据时,判断输入数字是否合法,如果合法,则进行运算。
  • 2.判断用户所输入的数据大小,若输入数据为由大到小或由小到大,经过补齐运再减去中间柱子的高度,即为所获取的青豆数目。
  • 3.若输入数据不是顺序结构,则将用户数据分割为多段顺序数据进行(2)中运算,累加每段数据青豆数目,即为总的青豆数目。
  • 4.代码实现:
from numpy import sort
def hight(sum_list):
    a = sort(sum_list)
    w = list(enumerate(a))
    l = len(w)
    for i in range(0, l - 2):
        c = w[l - 2][1] * (l - 2) - w[i][1]
    return  c
def Flag(result, indix, val):
    max_val = max(result)
    sum_list.append(val)
    if val < max_val:
        for Indix, Val in enumerate(result[indix:]):
            if val >= Val:
                sum_list.append(Val)
            else:
                sum_list.append(Val)
                result_list.append(Indix)
                c = hight(sum_list)
                sum_list.clear()
                return result_list[-1] + 1, c
    else:
        c = hight(result[indix:])
        return len(result[indix:]), c
 def star():
    result = []
    result_list = []
    sum_list = []
    H = 0
    F = 0
    print('主题 4:攒青豆'.center(40,'*'))
    Hight_parser = input('柱子高度:').strip()
    Hight_parser =Hight_parser.replace(",", "")
    for i in Hight_parser:
        result.append(int(i))
    flag, h = Flag(result, 1, result[0])
    count = len(result) - flag - 1
    while count:
        F, H = Flag(result, flag + 1, result[flag])
        H = +H
        count -= F
    print(f'可以接到[ {H + h} ]个单位的青豆')
if __name__ == '__main__':
    start()

测试结果如下:

4.jpg

5.jpg

- ------初次投稿,还有许多不足需要,请指教包容。