第一行包含一个数字 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分,比赛已经全部结束因此最终不能打平。
这道题其实是一个线性方程组求解问题。设k场比赛的三只球队的得分分别为x1,x2,x3.设此后n - k场比赛的三只球队得分分别为t1,t2,t3.
那么可以得到以下方程:
|x1 - x2| = d1
|x2 - x3| = d2
x1 + x2 + x3 = k
t1 + t2 + t3 = n - k
x1 + t1 = x2 + t2 = x3 + t3
显然以上共有6个线性无关的方程,可以将6个未知量分别解出,得到
x1 = (k - (2d1 + d2)) / 3
x2 = (k - (d2 - d1)) / 3
x3 = (k + (d1 + 2d2)) / 3
t1 = (n - k + (2d1 + d2)) / 3
t2 = (n - k + (d2 - d1)) / 3
t3 = (n - k - (d1 + 2d2)) / 3
其中d1,d2分别取正负号,总共可能存在4组解。分别验证这四组解中,是否有使得各个未知量均为非负整数的解,若存在,则有可行解。
num = int(input()) list = [] def f(_list,k): _max = max(_list) others = [] for e in _list: if e[1] != _max[1]: others.append(e[0]) sum = _max[0] - others[0] sum += _max[0] - others[1] x = k - sum if x >= 0 and int(x) % 3 == 0: return True else: return False for i in range(num): list.append([int(e) for e in input().split(' ')]) for row in list: n = row[0] _k = row[0] - row[1] k = row[1] d_1 = row[2] d_2 = row[3] is_ok = False for flag in range(4): if flag == 0: g_2 = (k+d_2-d_1)/3 if g_2 % 1 != 0 : continue g_1 = g_2 + d_1 g_3 = g_2 - d_2 if g_1 >= 0 and g_2 >= 0 and g_2 >= 0: is_ok = f([[g_1,0],[g_2,1],[g_3,2]],_k) if is_ok == True:break else: is_ok = False if flag == 1: g_2 = (k+d_2+d_1)/3 if g_2 % 1 != 0 : continue g_1 = g_2 - d_1 g_3 = g_2 - d_2 if g_1 >= 0 and g_2 >= 0 and g_2 >= 0: is_ok = f([[g_1,0],[g_2,1],[g_3,2]],_k) if is_ok == True:break else: is_ok = False if flag == 2: g_2 = (k-d_2-d_1)/3 if g_2 % 1 != 0 : continue g_1 = d_1 + g_2 g_3 = d_2 + g_2 if g_1 >= 0 and g_2 >= 0 and g_2 >= 0: is_ok = f([[g_1,0],[g_2,1],[g_3,2]],_k) if is_ok == True:break else: is_ok = False if flag == 3: g_2 = (k-d_2+d_1)/3 if g_2 % 1 != 0 : continue g_1 = g_2 - d_1 g_3 = g_2 + d_2 if g_1 >= 0 and g_2 >= 0 and g_2 >= 0: is_ok = f([[g_1,0],[g_2,1],[g_3,2]],_k) if is_ok == True:break else: is_ok = False if is_ok == True: print('yes') else: print('no')
#include <iostream>usingnamespacestd;intmain(){int t;while( cin>>t ){long long n,k,d1,d2;for(int q=0; q<t; q++){cin >> n >> k >> d1 >> d2;int yes=0;int sign=0;int c=0;if(n%3==0){if((k+d1+d2)%3==0 && (k+d1+d2)/3<=k && (k+d1+d2)/3-d1>=0 && (k+d1+d2)/3-d2>=0 ){c=d1+d2;sign=1;}else if((k-d1-d2)%3==0 && k-d1-d2>=0 && (k-d1-d2)/3+d1<=k && (k-d1-d2)/3+d2<=k ){if(d2>=d1)c=d2+d2-d1;elsec=d1+d1-d2;sign=1;}else if((k+d1-d2)%3==0 && k+d1-d2>=0 && (k+d1-d2)/3<=k && (k+d1-d2)/3-d1>=0 && (k+d1-d2)/3+d2<=k ){c=d2+d1+d2;sign=1;}else if((k-d1+d2)%3==0 && k-d1+d2>=0 && (k-d1+d2)/3<=k && (k-d1+d2)/3-d2>=0 && (k-d1+d2)/3+d1<=k){c=d1+d2+d1;sign=1;}}if(sign==1 && n-k-c>=0){if((n-k-c)%3==0)yes=1;}if(yes==1)cout << "yes"<< endl;elsecout << "no"<< endl;}}return 0;}