三哥烤丝瓜
题目:三哥很喜欢吃丝瓜,尤其是烤丝瓜,三哥有一个巨大丝瓜想要烤着吃。为了节约能源,厨房里的炉子在打开k分钟后自动关闭。烹饪时,三哥每隔d分钟就去厨房,如果炉子关了,她就打开炉子。当炉子关闭时,它依然保持温度,但会有所降低。众所周知,如果打开炉子,丝瓜在炉子上烹调到熟需要t分钟,如果关闭炉子,炉子依然是温暖的,则需要2t分钟。你需要弄清楚,三哥需要花多少时间来烤丝瓜。(当炉子关闭的瞬间三哥进入厨房他也会打开炉子)
单行包含三个整数k,d,t(0<k,d,t<1018 )。
打印单个数字,烹饪总时间(分钟)。如果你的答案与正确答案的差的绝对值小于10-8,则认为正确
来源:牛客网
链接 https://ac.nowcoder.com/acm/contest/24803/K
个人思路
-
分为以下几种情况
① 当t <= k时,也就是炉子还没到达关闭时瓜就能煮熟,所以可以直接返回t② 当①不满足即t > k且d > k时,也就是三哥每次都在炉子关闭后才来,这时我们需要判断瓜是否在三哥来之前就熟了,如果熟了,则返回k + 2 * (t-k){关闭炉子后效率降低,要乘以2},如果没熟,返回d + resolve(k,d,t-k-0.5*(d-k)){即已经煮了d分钟,瓜剩余要煮的时间为t-k-0.5*(d-k)}
③ 当①、②都不满足且k是d的倍数时,也就是三哥每次都会在炉子关闭的时候恰好进来,所以瓜一直都是烤的状态,这时返回瓜要烤的时间,即t
④ 当①、②、③都不满足时,即瓜要烤较长时间,d < k且t > k时,这时,我们需要找到每次瓜被烤和被余温热的时间,同理,因为d < k且t > k,所以瓜必然烤了k分钟,炉子关闭后三哥到来前的时间为(k // d +1)*d - k或者d-(k%d),除以2就相当于被烤的时间,如果大于t返回实际时间,否则递归
import sys
sys.setrecursionlimit(100000) # 控制递归次数,例如这里设置为十万
a,b,c = input().split(' ')
k = eval(a)
d = eval(b)
t = eval(c)
def resolve(k,d,t):
if t <= k:
return(t)
if d > k:
if k + 0.5 * (d-k) >= t:
return k + 2 * (t-k)
else:
return d + resolve(k,d,t-k-0.5*(d-k))
if k % d == 0:
return t
else:
if k+0.5*( (k // d +1)*d - k) >= t:
return k+0.5*(t - k)
else:
return (k // d +1)*d + resolve(k,d,t-k-0.5*( (k // d +1)*d - k))
# print('%.9f' % resolve(k,d,t)) # 测试时间