此题真的是做的我难受的很。题目给出了三个队伍的差,但没说是正还是负,咱们的目标就是得到这三个数,之后就可以返回结果。实际操作中,并不需要真正解出这三个数,因为情况很多要分类讨论,咱们要满足解出的每个数>0,并且剩下的够分。代码很简洁,但是思路挺乱,最好提前写好注释,以小的为基础列方程。
N = int(input())
for i in range(N):
l = list(map(int, input().split(' ')))
n, k, d1, d2 = l[0], l[1], l[2], l[3]
# 找出三队的真实比分, 根据真实比分输出结果
if k == 0:
if n % 3 == 0: print('yes')
else: print('no')
else:
ok = 0
# a > b < c
if k-d1-d2 >= 0 and (k-d1-d2)%3 == 0:
if d1 > d2 and n-k-2*d1+d2 >= 0 and (n-k-2*d1+d2)%3 == 0: ok = 1
elif d1 < d2 and n-k-2*d2+d1 >= 0 and (n-k-2*d2+d1)%3 == 0: ok = 1
# a < b < c
if k-2*d1-d2 >= 0 and (k-2*d1-d2)%3 == 0:
if n-k-d1-2*d2 >= 0 and (n-k-d1-2*d2)%3 == 0: ok = 1
# a > b > c
if k-d1-2*d2 >= 0 and (k-d1-2*d2)%3 == 0:
if n-k-2*d1-d2 >= 0 and (n-k-2*d1-d2)%3 == 0: ok = 1
# a < b > c
if (k+d1+d2)%3 == 0:
b = (k+d1+d2)//3
if b-d1 >= 0 and b-d2 >= 0 and n-k-d1-d2 >= 0 and (n-k-d1-d2)%3 == 0: ok = 1
if ok == 1: print('yes')
else: print('no')