CSP真题【201812-2】 小明放学
这题分两块写吧,因为自己按自己的想法写的代码没能满分>_<
先写借鉴别的大佬写的吧~~
def gettime(k,t,time):
if k == 0:
return t
if k == 1:
if time<=t:
return t-time
else:
return gettime(3,g,time-t)
if k == 2:
if time<=t:
return t-time+r
else:
return gettime(1,r,time-t)
if k == 3:
if time<=t:
return 0
else:
return gettime(2,y,time-t)
if __name__ == '__main__':
r, y, g = map(int, input().split())
n = int(input())
sum = 0
arr = []
ryg = r+y+g
for i in range(n):
arr.append([0, 0])
arr[i][0], arr[i][1] = map(int, input().split())
sum += gettime(arr[i][0],arr[i][1],sum%ryg)
print(sum)
我觉得真的是很巧妙,用了递归,真的是没有想到,积累起来—>所以我的想法是在每一种情况里进行计算,看小明到达这个路口的时候是什么颜色,还剩多长时间!!(tips:累的苦哈还没拿到分数,各位有空可否指点一二,感激不尽!!!)
bia代码:
# 输入三种灯的时间
r, y, g = map(int, input().split())
# 输入一共多少段
n = int(input())
sum = 0
# 每一段用这个列表保存
arr = []
for i in range(n):
arr.append([0, 0])
arr[i][0], arr[i][1] = map(int, input().split())
# 0的时候表示路,啥也不用管,直接加
if arr[i][0] == 0:
sum = sum + arr[i][1]
# print(sum)
else:
# 1的时候表示红灯
if arr[i][0] == 1:
# 判断红灯的剩余时间和之前所有时间的大小,如果红灯时间久,小明过来还是红灯-->等着
if (arr[i][1] - sum) > 0:
mid = arr[i][1] - sum
sum = sum + mid
# 和刚开始相比,变灯了
else:
cha = (sum - arr[i][1]) % (r + y + g)
if cha < g:
sum = sum
# elif cha < g + y:
# sum = sum + y - cha
elif cha < g + y + r:
sum = sum + g + r + y - cha
# print(sum)
# 2表示黄灯
if arr[i][0] == 2:
if (arr[i][1]- sum) > 0:
mid = arr[i][1] - sum
sum = sum + mid + r
else:
cha = (sum - arr[i][1]) % (r + y + g)
if cha < r:
sum = sum + r - cha
elif cha < r + g + y:
sum = sum + y + 2 * r + g - cha
# print(sum)
# 3表示绿灯
if arr[i][0] == 3:
if (arr[i][1] - sum) > 0:
sum = sum
else:
cha = (sum - arr[i][1]) % (r + y + g)
if cha < y + r:
sum = sum + r + y - cha
# print(sum)
print(sum)
找了很久,还是没找到自己错在哪块,求教!!!
总结一下自己的问题吧:
- 习惯一整块往下写,一般不会考虑到使用函数–>写程序很麻烦冗余 ……吸取教训!!
- 递归思想确实掌握不是很到位!
- 加油加油加油~