解题思路:本题中每一秒可以做出的选择有三种,闪现,跑步,等待,闪现的话他有蓝量的限制,这一秒能不能闪取决于蓝量还够不够,每一步的状态改变是可以影响下一步的,是一个简单动态规划问题,而跑步的话就简单了,每一秒都能开跑,基于截止到上一秒的最大位移量加上这一秒跑出去的距离就行了,因此在解决问题时候,应该同时考虑选择闪现和跑步的情况,每一秒将最大位移更新为这一秒闪现或是跑步能做出的最大位移,最后进行题目要求的条件判断就可以了
注意事项:a是用来保存跑出去后用了几秒的,如果没跑出去a不会更新,所以判断Yes的情况时,不仅要让a<t,还要让a不等于初始值,说明真的跑出去了
参考代码:
m,s,t=map(int,input().split())
blink=[0]*(t+1)#保存闪现位移
run=[0]*(t+1)#保存跑步位移
maxlong=[0]*(t+1)#每一秒最大位移量
a=0
for i in range(1,t+1):
run[i]=maxlong[i-1]+17
if m>=10:
blink[i]=blink[i-1]+60#动态规划不能保证局部最优解,因此不是blink[i]=maxlong[i-1]+60
m-=10
else:
blink[i]=blink[i-1]
m+=4
maxlong[i]=max(run[i],blink[i])
if maxlong[i]>=s:
a=i
break
if a<=t and a!=0:
print('Yes')
print(a)
else:
print('No')
print(maxlong[t])
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复