第一行包含一个数字 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分,比赛已经全部结束因此最终不能打平。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long int n, k, d1, d2;
cin>>n>>k>>d1>>d2;
if(n % 3 != 0) {cout<<"no"<<endl; continue;}
int S[] = {-1,1};
bool flag = 0;
for(auto s1:S){ //遍历d1,d2的正负
for(auto s2:S){
long int x1 = k -2*s1*d1 - s2*d2;
if(x1%3 != 0) continue;
else{
x1 /= 3;
long int x2 = x1 + s1*d1;
long int x3 = x2 + s2*d2;
auto mi = min(min(x1,x2),x3);
auto ma = max(max(x1,x2),x3);
if(mi < 0) break;
if(ma <= n/3) flag = 1;
}
}
}
if(flag) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int flag[4][2] = {{1,1},{-1,-1},{1,-1},{-1,1}}; // 两个差值的四种符号情况
int main(){
int t, f = 1;
long long n, k, d1, d2;
cin >> t;
while(t--){
// 得到解置f为0
f = 1;
cin >> n >> k >> d1 >> d2;
for(int i = 0;i < 4 && f == 1;i++){
long long tempd1 = flag[i][0] * d1;
long long tempd2 = flag[i][1] * d2;
long long tempa = 2 * tempd1 + tempd2 + k;
if(tempa < 0 || tempa % 3 != 0)
continue;
else{
long long a = tempa / 3;
long long b = a - tempd1;
long long c = k - a - b;
if(b < 0 || c < 0)
continue;
else{
long long maxscore = (a > b ? max(a, c) : max(b, c));
long long re***axscore * 3 - a - b - c;
if(res == n - k || (res < n-k && (n - k - res) % 3 == 0))
f = 0
}
}
if(f == 1)
cout<<"no"<<endl;
else
cout<<"yes"<<endl;
}
return 0;
}
class Solution
{
public:
bool couldTie(int64_t n, int64_t k, int64_t d1, int64_t d2) {
// 用s1, s2, s3分别表示三个队的头条分数
int64_t remain = n - k;
// 第一个santisfy表示满足case1: s1 > s2 > s3的条件
// 此时s1 至少为d1+d2, s2至少为d2, s3至少0,k余下的场次数需是3的倍数
// 第二个santisfy为余下的场次能打成平局的条件
// s2再赢d1场,s3再赢d1+d2场, n - k余下的场次数需是3的倍数
if (Satisfy(k, d1 + 2 * d2) && Satisfy(remain, 2 * d1 + d2)) {
return true;
}
// case2: s1 < s2 < s3
if (Satisfy(k, 2 * d1 + d2) && Satisfy(remain, d1 + 2 * d2)) {
return true;
}
// case3: s2最小
if (Satisfy(k, d1 + d2) && Satisfy(remain, 2 * max(d1, d2) - min(d1, d2))) {
return true;
}
// case4: s2最大
if (Satisfy(k, 2 * max(d1, d2) - min(d1, d2)) && Satisfy(remain, d1 + d2)) {
return true;
}
return false;
}
bool Satisfy(int64_t remain, int64_t demand) {
return (remain >= demand && ((remain - demand) % 3 == 0));
}
};
int main()
{
Solution demo;
int t;
int64_t n, k, d1, d2;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%lld%lld%lld%lld", &n, &k, &d1, &d2);
printf(demo.couldTie(n, k, d1, d2) ? "yes\n" : "no\n");
}
return 0;
}
t = int(input())
res = []
for i in range(t):
n, k, d1, d2 =[int(x) for x in input().split()]
if n % 3 != 0:
res.append('no')
continue
## 求出三个球队的得分
if (k+2*d1+d2)%3 == 0 and (k-d1+d2)%3 == 0:
x = (k+2*d1+d2) /3
y = (k-d1+d2) / 3
z = k - x - y
if (x >= 0 and y >= 0 and z >= 0):
score1 = x
score2 = y
score3 = z
max_score = max(score1, score2, score3)
dif1 = max_score - score1
dif2 = max_score - score2
dif3 = max_score - score3
if dif1 + dif2 + dif3 <= n - k :
res.append('yes')
continue
if (k-2*d1+d2)%3 == 0 and (k+d1+d2)%3 == 0:
x = (k-2*d1+d2) /3
y = (k+d1+d2) / 3
z = k - x - y
if (x >= 0 and y >= 0 and z >= 0):
score1 = x
score2 = y
score3 = z
max_score = max(score1, score2, score3)
dif1 = max_score - score1
dif2 = max_score - score2
dif3 = max_score - score3
if dif1 + dif2 + dif3 <= n - k :
res.append('yes')
continue
if (k+2*d1-d2)%3 == 0 and (k-d1-d2)%3 == 0:
x = (k+2*d1-d2) /3
y = (k-d1-d2) / 3
z = k - x - y
if (x >= 0 and y >= 0 and z >= 0):
score1 = x
score2 = y
score3 = z
max_score = max(score1, score2, score3)
dif1 = max_score - score1
dif2 = max_score - score2
dif3 = max_score - score3
if dif1 + dif2 + dif3 <= n - k :
res.append('yes')
continue
if (k-2*d1-d2)%3 == 0 and (k+d1-d2)%3 == 0:
x = (k-2*d1-d2) /3
y = (k+d1-d2) / 3
z = k - x - y
if (x >= 0 and y >= 0 and z >= 0):
score1 = x
score2 = y
score3 = z
max_score = max(score1, score2, score3)
dif1 = max_score - score1
dif2 = max_score - score2
dif3 = max_score - score3
if dif1 + dif2 + dif3 <= n - k :
res.append('yes')
continue
res.append('no')
for i in range(len(res)):
print(res[i])
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
long long t;
cin>>t;
long long n,k,d1,d2;
while(t--) {
cin>>n>>k>>d1>>d2;
long long x=n-k;
if(x==0){
if(d1==0 && d2==0) {
cout<<"yes"<<endl;
}else
cout<<"no"<<endl;
continue;
}
//!!!!!因为目前一共只打了k场,所以x1+x2+x3==k
if(k-2*d1-d2>=0 && (k-2*d1-d2)%3==0 && (x-(2*d2+d1))>=0 && (x-(2*d2+d1))%3==0) {
//第一种情况x1<=x2<=x3
//此时x1+x2+x3=x1+(x1+d1)+(x1+d1+d2)=3x1+2d1+d2==k,因为x1=(k-2*d1-d2)/3,
//x-(2*d2+d1)为三队追平比分需要的场数,后面如有多余需要均分给三队
cout<<"yes"<<endl;
} else if(k-2*d1+d2>=0 && (k-2*d1+d2)%3==0 && (x-d1-d2)>=0 && (x-d1-d2)%3==0) {
//第二种情况x1<=x2,x2>=x3,即x2=x1+d1,x3=x2-d2=x1+d1-d2
//此时x1+x2+x3=3x1+2d1-d2=k
//若要追平,需要d1+d2场,后面如有多余要均分给三队
cout<<"yes"<<endl;
} else if(k+2*d1-d2>=0 && (k+2*d1-d2)%3==0 && (x-max(d1,d2)-abs(d1-d2))>=0 && (x-max(d1,d2)-abs(d1-d2))%3==0) {
//第三种情况,x1>=x2,x2<=x3,即x2=x1-d1,x3=x2+d2=x1-d1+d2
cout<<"yes"<<endl;
}else if(k+2*d1+d2>=0 && (k+2*d1+d2)%3==0 && (x-(2*d1+d2))>=0 && (x-(2*d1+d2))%3==0) {
//第四种情况,x1>=x2,x2>=x3,即x2=x1-d1,x3=x2-d2=x1-d1-d2
cout<<"yes"<<endl;
}else
cout<<"no"<<endl;
}
return 0;
} #include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int t;
long int n, k, d1, d2, tmp ,left;
cin >> t;
while(t > 0)
{
t--;
cin >> n >> k >> d1 >> d2;
tmp = k - d1 - d1 - d2; //球队1< 球队2,球队2<球队3
if(tmp >= 0 && tmp % 3 == 0) //球队1的得分有解是大前提
{
left = (n - k) - (d1 + d2 + d2);
if(left >= 0 && left % 3 == 0)//剩下的场次不小于need,并且可以均分3场。
{
cout << "yes" << endl;
continue;
}
}
tmp = k - d1 - d1 + d2; //球队1< 球队2,球队2>球队3
if(tmp >= 0 && tmp % 3 == 0)
{
left = (n - k) - (d1 + d2);
if(left >= 0 && left % 3 == 0)
{
cout << "yes" << endl;
continue;
}
}
tmp = k + d1 + d1 + d2;//球队1> 球队2,球队2>球队3
if(tmp >= 0 && tmp % 3 == 0)
{
left = (n - k) - (d1 + d1 + d2);
if(left >= 0 && left % 3 == 0)
{
cout << "yes" << endl;
continue;
}
}
tmp = k + d1 + d1 - d2;//球队1>球队2,球队2<球队3
if(tmp >= 0 && tmp % 3 == 0)
{
if(d1 >= d2)
{
left = (n - k) - (d1 + d1 - d2);
}
else
{
left = (n - k) - (d2 + d2 - d1);
}
if(left >= 0 && left % 3 == 0)
{
cout << "yes" << endl;
continue;
}
}
cout << "no" << endl;
}
return 0;
} #include <bits/stdc++.h>
#define QAQ 0x3f3f3f3f
using namespace std;
int main()
{
long long t,n,k,d1,d2,a,b,c;
scanf("%lld",&t);
while(t--)
{
scanf("%lld %lld %lld %lld",&n,&k,&d1,&d2);
if(n%3!=0)
{
printf("no\n");
continue;
}
int flag=0;
for(int i=-1;1>=i;i=i+2)
{
for(int i1=-1;1>=i1;i1=i1+2)
{
long long d11=d1*i;
long long d22=d2*i1;
a=(k-2*d11+d22)/3;
b=(k+d11+d22)/3;
c=(k+d11-2*d22)/3;
if(a+b+c!=k||a<0||b<0||c<0)
{
continue;
}
if(a>n/3||b>n/3||c>n/3)
{
continue;
}
printf("yes\n");
flag=1;
break;
}
if(flag==1)break;
}
if(flag==0)
printf("no\n");
}
return 0;
}
/*
a = (k-2*d1+d2)/3
b = (k+d1+d2)/3
c = (k+d1-2*d2)/3
*/
首先考虑试题,失败不扣分,没有平局,赢了加1分,则总分就是N,如果N不能被3整除,则不能平局
然后考虑分差,如果剩余比赛(N-K)不足以弥补分差(d1+d2)那就肯定不能平局。
在考虑剩下的情况,如果是平局则每个球队得分应该都是N/3,如果其中一个球队得分大于N/3,则不能平局。
试题转换为判断当前比赛有没有球队得分超过N/3;
设最少得分的球队为M,
则三队得分有4种可能:
M,M+d1,M+d2+d1;
M,M+d2,M+d2+d1;
M,M+d1,M+d2;
M,M+d1,M+d1-d2;(假设d1大于d2)
求出M的值(M需要满足大于等于0,能被三整除),然后就可以计算出得分最高的球队,如果最高得分不高于N/3,则就算成功
(如果多个情况都满足条件,则其中有一个可以满足就行)
import java.util.Scanner;
public clas***ain {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
for (int i = 0; i < N; i++)
{
if (jump(in.nextLong(), in.nextLong(), in.nextLong(), in.nextLong())) { System.out.println("yes"); } else { System.out.println("no"); } } } public static boolean jump(Long n, Long k, Long d1, Long d2) { if (n % 3 != 0 || k > n - d1 - d2) {
return false;
}
Long max = d1 > d2 ? d1 : d2;
Long min = d1 > d2 ? d2 : d1;
Long m1 = k - 2 * d1 - d2;
Long m2 = k - 2 * d2 - d1;
Long m3 = k - d1 - d2;
Long m4 = k - 2*max + min;
if ((m1 >=0 && m1 % 3 == 0 && m1/3 + d1 + d2 <= n / 3)
|| (m2 >=0 && m2 % 3 == 0 && m2/3 + d1 + d2 <= n / 3)
|| (m3 >=0 && m3 % 3 ==0 && m3/3 + max <= n / 3)
|| (m4 >= 0 && m4 % 3 ==0 && m4/3 + max > 0) )
{
return true;
}
return false;
}
}
import java.util.Scanner;
public class solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = Integer.parseInt(sc.nextLine());
for (int i = 0; i < t; i++) {
String s = sc.nextLine();
String[] ss = s.split(" ");
long n = Long.parseLong(ss[0]);
long k = Long.parseLong(ss[1]);
long d1 = Long.parseLong(ss[2]);
long d2 = Long.parseLong(ss[3]);
boolean target = game(n, k, d1, d2) || game(n, k, -d1, d2) || game(n, k, d1, -d2) || game(n, k, -d1, -d2);
System.out.println(target ? "yes" : "no");
}
}
public static boolean game(long n, long k, long d1, long d2) {
long temp1 = 2 * d1 + d2;
long temp2 = n - k;
if (k >= temp1 && (k - temp1) % 3 == 0) {
if ((temp1 + temp2) >= 0 && (temp1 + temp2) % 3 == 0 &&
(k - temp1) / 3 <= n / 3 &&
(k - temp1) / 3 + d1 <= n / 3 &&
(k - temp1) / 3 + d1 + d2 <= n / 3
) return true;
else return false;
} else {
return false;
}
}
}
if (n % 3 != 0 || ((n - k) - (d1 + d2)) < 0 || (n / 3 - d1) < 0 || (n / 3 - d2) < 0) { printf("no\n"); continue; }
if (((n - k) - (d1 + 2 * d2))%3==0 || ((n - k) -(d2 + 2 * d1))%3==0 || ((n - k) -(d1 + d2))%3==0) printf("yes\n");
else printf("no\n"); #include <bits/stdc++.h>
using namespace std;
bool F(long m, long k, long x, long y, long z){
if(x<0 || y<0 || z<0)
return 0;
long s=x+y+z, Max = max(x, max(y, z));
return (s<=k && (k-s)%3==0 && (3*Max-s)<=m && (m-(3*Max-s))%3==0);
}
int main(){
int T;
long n, k, d1, d2;
scanf("%d", &T);
while(T--){
scanf("%ld%ld%ld%ld", &n, &k, &d1, &d2);
long m = n - k;
bool r = 0;
r |= F(m, k, 0, d1, d1+d2);
r |= F(m, k, 0, d1, d1-d2);
r |= F(m, k, d1, 0, d2);
r |= F(m, k, d1+d2, d2, 0);
r |= F(m, k, d2-d1, d2, 0);
printf("%s\n", r?"yes":"no");
}
return 0;
}