题解 | #编程题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")

#刷题##贪心不贪心#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务