CodeChef MELTGOLD问题代码TLE求助:计算熔炉达熔点最短时间
问题描述
Chef有一块熔点为X度的矿石,他的熔炉初始温度为Y度。第i分钟结束后,熔炉温度会升高i度。
请计算矿石开始熔化所需的最短时间(分钟数)。
注意:
我们只关注每分钟结束时的温度,不考虑分钟过程中的温度变化。
当熔炉温度大于或等于熔点时,矿石开始熔化。
代码超时问题求助
我编写了如下代码,但遇到了TLE(超时)问题,请求帮助优化代码以解决超时问题:
t = int(input()) for i in range(t): x, y = map(int, input().split()) time = 0 # x %= pow(10, 9) + 7 # y %= pow(10, 9) + 7 if x == y: print(0) else: while(x>y): time += 1 y += time print(time)
优化方案
超时原因
原代码通过while循环逐分钟模拟温度变化,当X和Y的差距极大(比如达到1e9级别)时,循环次数会高达数万次,直接导致超时。
数学推导优化
经过n分钟后,熔炉总温度为:Y + 1 + 2 + ... + n = Y + n*(n+1)/2
我们需要找到最小的n,使得Y + n*(n+1)/2 >= X,即n*(n+1)/2 >= S(其中S = max(0, X-Y))。
解二次方程n² + n - 2S = 0,正根为:n = [-1 + sqrt(1 + 8*S)] / 2
取该值的上取整,即为所需的最短时间。
优化后代码
import math t = int(input()) for _ in range(t): x, y = map(int, input().split()) if y >= x: print(0) continue s = x - y # 计算满足条件的最小n值 n = math.ceil((-1 + math.sqrt(1 + 8 * s)) / 2) print(n)
该方案将每组测试用例的时间复杂度降至O(1),彻底解决超时问题。
内容的提问来源于stack exchange,提问作者Bobburi Manasa Adithy
相关产品推荐
相关产品推荐

