链接:https://ac.nowcoder.com/acm/problem/14392
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
题目描述
有n只猴子,第i只猴子每过xi小时会连续吃香蕉yi小时。猴子从第二次开始每次休息结束后这只猴子连续吃香蕉的时间会增加zi小时。
给定n只猴子,每一只的xi,yi,zi,以及时间t,求在前t小时中,所有猴子共吃了多少小时。
对于一只猴子来说是这样的:
从第1小时开始:
休息xi小时( 1 -> xi )
吃yi小时( xi + 1 -> xi + yi )
休息xi小时
吃yi+zi小时
休息xi小时
吃yi+zi+zi小时
…
输入描述:
第一行两个数n和t;
之后n行,第i+1行每行三个数xi,yi,zi.
输出描述:
一行一个数表示答案.
开始用暴力的方法,发现会超时。然后参考了其他人的题解 ,发现可以用解方程的方法来降低时间复杂度。这其实是一个等差数列的问题。这里还要注意python3的除法结果会保留1位小数,所以要使用//。
a1 = x+y
an = a1+(n-1)d
2*t = 2Sn = n*(a1+an) = n*(2*a1+(n-1)*d)ax^2+bx+c=02*a1*n+d*n^2-d*n-2*t = 0
d*n^2 + (2*a1-d)n + (-2*t) = 0a = d
b = 2*a1-d
c = -2*t
n, t = list(map(int, input().split()))
ans = 0
import math
for i in range(n):x, y, z = list(map(int, input().split()))if z == 0:count = t/(x+y)else:a = zb = 2*x+2*y-zc = -2*tcount = (-b + math.sqrt(b**2 - 4*a*c))/(2*a)count = math.floor(count)ans += y*count + count*(count-1)*z//2tmp = t - (x+y)*count - count*(count-1)*z//2 - xif tmp > 0:ans += tmpprint(ans)