题解 | #编程题1#
编程题1
https://www.nowcoder.com/practice/ff518f3162c849b9a84d1fab8e7179be
#解方程的思想:若想打平需满足
#1)总场数是3的倍数n%3==0
#2) 差距超过1/3则无法追平比分
#3)每场比赛得分最多的不得超过总场数的1/3
#4) 剩余场数能弥补差距
#5)弥补差距后的数能被3整除
#根据题意设每场比赛球队i得xi分,可根据情况列出方程:
#x1 + x2 + x3 =K
#当x1>x2,x2>x3时,x1- x2=d1,x2-x3=d2,求得x1=(k+2d1+d2)/3 x2 = (k+d2-d1)/3,x3=(k-2*d2-d1)/3,补平差距:2*x1-x2-x3=2*d1+d2
#当x1>x2,x2<x3时,x1- x2=d1,x3-x2=d2,求得x1=(k+2d1-d2)/3 x2 = (k-d1-d2)/3,x3=(k+2*d2-d1)/3,补平差距:得满足让x2加上与min(x1,x3)相差一部分,再让x1x3中小的那个加上|x1-x3|一部分,min(d1,d2)+2*abs(d1-d2)
#当x1<x2,x2>x3时,x2- x1=d1,x2-x3=d2,求得x1=(k-2d1+d2)/3 x2=(k+d1+d2)/3 ,x3=(k+d1-2d2)/3 ,补平差距:x2-x1+x2-x3=d1+d2
#当x1<x2,x2<x3时,x2- x1=d1,x3-x2=d2,求得x1= (k-d2-2d1) /3 x2 = (k-d2+d1)/3 ,x3=(k+2d2+d1)/3,补平差距:x3-x1 +x3-x2=2*d2+d1
t = input()
for i in range(0,int(t)):
n,k,d1,d2 =map(int,input().split() )
#不是3倍数直接pass
if n%3!=0:
print("no")
#差距超过1/3则无法追平比分
elif d2>n/3 or d1>n/3:
print("no")
#x1>x2,x2>x3,x1<=n/3
elif (k+2*d1+d2)>= (k+d2-d1)and (k+2*d1+d2)>=(k-2*d2-d1) and (k+2*d1+d2)<=n and (n-k)>=(2*d1+d2) and (n-k-2*d1-d2)%3==0 :
print("yes")
#x1>x2,x2<x3,x1,x3<=n/3,无法判断x1和x3谁大,采用绝对值函数和min函数计算差距
elif (k+2*d1-d2)>(k-d1-d2) and (k+2*d2-d1)>(k-d1-d2)and (k+2*d2-d1)<=n and (k+2*d1-d2)<=n and(n-k)>=(min(d1,d2)+2*abs(d1-d2)) and (n-k-min(d1,d2)-2*abs(d1-d2))%3==0:
print("yes")
#x1<x2,x2>x3,x2<=n/3
elif (k+d1+d2)>=(k-2*d1+d2)and(k+d1+d2)>=(k+d1-2*d2) and (k+d1+d2)<=n and (n-k)>=(d1+d2) and (n-k-d1-d2)%3==0:
print("yes")
#x1<x2,x2<x3,x3<=n/3
elif (k+2*d2+d1)>=(k-d2-2*d1) and (k+2*d2+d1)>=(k-d2+d1) and (k+2*d2+d1)<=n and (n-k)>=(2*d2+d1) and (n-k-2*d2-d1)%3==0:
print("yes")
else:
print("no")
#刷题##贪心不贪心#