第一行包含一个数字 t (1 <= t <= 10)
接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n <= 10^12; 0 <= k <= n, 0 <= d1, d2 <= k)
每行的比分数据,最终三只球队若能够打平,则输出“yes”,否则输出“no”
2 3 3 0 0 3 3 3 3
yes no
case1: 球队1和球队2 差0分,球队2 和球队3也差0分,所以可能的赛得分是三只球队各得1分
case2: 球队1和球队2差3分,球队2和球队3差3分,所以可能的得分是 球队1得0分,球队2得3分, 球队3 得0分,比赛已经全部结束因此最终不能打平。
设三只队伍各赢了x1、x2、x3场,列如下方程(其中a,b = ±1):
x1 - x2 = a*d1
x2 - x3 = b*d2
x1 + x2 + x3 = k
可得解为:
x1 = (k + 2*a*d1 + 1*b*d2) / 3
x2 = (k - 1*a*d1 + 1*b*d2) / 3
x3 = (k - 1*a*d1 - 2*b*d2) / 3
将a,b遍历,再做如下筛选,即可得到各支队伍赢的场数:
not x.is_integer() or x < 0 or x > k
根据题意,再做简单判断即可得到最终答案,完整代码如下:
def temp(k, d1, d2):
def helper(a, b):
x1 = (k + 2*a*d1 + 1*b*d2) / 3
x2 = (k - 1*a*d1 + 1*b*d2) / 3
x3 = (k - 1*a*d1 - 2*b*d2) / 3
return x1, x2, x3
results = []
for a in [1, -1]:
for b in [1, -1]:
x1, x2, x3 = helper(a, b)
isOK = True
for x in [x1, x2, x3]:
if not x.is_integer() or x < 0 or x > k:
isOK = False
if isOK:
results.append((x1,x2,x3))
return results
num = int(raw_input())
for i in xrange(num):
line = raw_input()
n, k, d1, d2 = map(float, line.strip().split())
if n % 3 != 0:
print 'no'
continue
results = temp(k, d1, d2)
if len(results) == 0:
print 'no'
continue
isOK = False
for result in results:
x = max(result)
if x <= n / 3:
isOK = True
break
if isOK:
print 'yes'
else:
print 'no'
function main(n, k, d1, d2) { var res = calcXYZ(k, d1, d2, 1, 1) if (test()) { return true } var res = calcXYZ(k, d1, d2, 1, -1) if (test()) { return true } var res = calcXYZ(k, d1, d2, -1, 1) if (test()) { return true } var res = calcXYZ(k, d1, d2, -1, -1) if (test()) { return true } return false function test() { if (res === false) return false var arr = [res.x, res.y, res.z] arr.sort(function(a, b) { return a - b }) var min = arr[0] var mid = arr[1] var max = arr[2] var distance = max - min + max - mid var remain = n - k if ((remain - distance >= 0) && (remain - distance) % 3 === 0) { return true } else { return false } } } function calcXYZ(k, d1, d2, isXMoreThanY, isYMoreThanZ) { var x = y + isXMoreThanY * d1 var y = (k + isYMoreThanZ * d2 - isXMoreThanY * d1) / 3 var z = y - isYMoreThanZ * d2 if (!isNotNegativeInteger(x) || !isNotNegativeInteger(x) || !isNotNegativeInteger(x)) { return false } else { return { x: x, y: y, z: z } } } //是否为非负整数 function isNotNegativeInteger(num) { if (typeof(num) !== "number") return false if (num < 0) return false if (num % 1 !== 0) return false return true } var num = parseInt(readline()) for (var x = 0; x < num; x++) { var arr = readline().split(" ") for (var i = 0; i < arr.length; i++) { arr[i] = parseInt(arr[i]) } var out = main(arr[0], arr[1], arr[2], arr[3]) if (out) { console.log("yes") } else { console.log("no") } }
let t=parseInt(readline());for(let i=0;i<t;i++){
let result='no';
let [n,k,d1,d2]=readline().split(' ').map(x=>parseInt(x));//解构赋值的方式获得n,k,d1,d2
//1,2,3号球队的得分关系有4种情况,1>2>3,1>2<3,1<2>3,1<2<3,分别求3种情况下至少还要多少球才能打平
let c0=d1+d1+d2;//至少需要多少球才能打平
let e0=d1+d2+d2;//至少需要多少球才能打成现在的情况
let c1=d2>d1?d2+d2-d1:d1+d1-d2;
let e1=d1+d2;
let c2=d1+d2;
let e2=d2>d1?d2+d2-d1:d1+d1-d2;
let c3=d1+d2+d2;
let e3=d1+d1+d2;
let scoreNeed=[c0,c1,c2,c3];
let kAtLeast=[e0,e1,e2,e3];
let possibleCases=[];//4种情况中可能出现的情况
for(let j=0;j<4;j++){
if(k>=kAtLeast[j]&&(k-kAtLeast[j])%3===0){
possibleCases.push(j);
}
}
for(let h of possibleCases){
if(n-k>=scoreNeed[h]&&(n-k-scoreNeed[h])%3===0){
result='yes';
break;
}
}
console.log(result);
}