第五期青训「青训营 X 码上掘金」主题创作活动。
寻友之旅&赞青豆 题目解析与代码实现
当青训营遇上码上掘金,一切的奋斗都从这里出发!
借着疫情全面好转,钟南山院士为全国人民解除疫情下的盾牌的良机,在一位校友的推荐下,我报名来到了青训。用已经掌握的计算机语言,很快就完成了主题编程任务,接下来分享一下解题过程。
主题3:寻友之旅
这道题为定点判断计算问题。为简化题目,将小青和小码视为质点,由题目分析:
- 小青和小码的初始位置都由用户输入整数,具有一定的随机性;且小码的位置固定,由小青主动去寻找小码。
- 小青和小码家在一条直线上,无需考虑转弯等特殊情况;且两人的家之间间隔在0~100000个单位之间。
- 小青拥有的两种交通工具中,步行可以是一分钟前进或后退一个单位;乘公交则只能往一个方向行动2个单位。
- 需要求解用户任意输入两人位置后,计算出小青到小码家最短的时间消耗。
- 问题假设:
(1)假设公交车只从一个方向出发后,永不回头及行驶行驶,即公交只能自起始位置0出发,一直行驶开往终点位置100000。
(2)假设输入小码家位置大于小青家位置,则小青可以立即乘坐公交车前往小码家,且公交车和步行两种交通方式可以相结合。
编程思路及程序源代码:
-
- 在用户输入数据时,允许用户输入不合法数据后重复输入,则采用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
测试结果如下:
主题4: 攒青豆
这道题为“接雨滴”问题。
借用官方思路,假设右边界无限高,容易求得这种情况下的最大装水量,再假设左边界无限高,同样容易求得左边界情况下的最大装水量,事实上,这两种情况的交集,就是总的装水量,借用官方的思路图解。
编程思路及程序源代码:
-
- 在用户输入数据时,判断输入数字是否合法,如果合法,则进行运算。
- 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()
测试结果如下: