1. 思路

  1. 先讲讲自己的思路:
    1)题目意思就是说存在不平衡的情况嘛,那方法就是解决不平衡,咋办呢,通过剩下的场数将平衡补正回来,能补正就yes,不能就no。但跑了之后发现只过了一组测试数据,那肯定还有自己没考虑到的。于是写恢复平衡的其他条件,但发现了一个问题。两个球队的分数差没有说分数那个高,也就意味着。补分数会影响第三队和第二队的分差,而后面的又会影响前面。这样就和需求不符合了(需求是三队分相同)
    #include<iostream>
    using namespace std;
    int main(){
     int t=0,n=0,k=0,d1=0,d2=0;
     cin>>t;
     while(t--){
         cin>>n>>k>>d1>>d2;
         int f=n-k;//还能踢几场
         if(f<d1+d2)
         {
             cout<<"no"<<endl;
         }else{
             if((f-d1-d2)%3==0)
                 cout<<"yes"<<endl;
             else if()//恢复平衡的其他条件
                 cout<<"yes"<<endl;
             else    
                 cout<<"no"<<endl;
         }
     }
     return 0;
    }

    二:大佬正解,解方程的思路MemoryLimitExceeded

图片说明

1.代码块

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long t,n,k,d1,d2,a,b,c;//注意使用long ling
   cin>>t;
    while(t--)
    {
       cin>>n>>k>>d1>>d2;
        if(n%3!=0)//三者平衡 不平衡的直接pass
        {
           cout<<"no"<<endl;
           continue;
        }
        int flag=0;
        for(int i=-1;1>=i;i=i+2)//i =-1 和1进行正负d遍历
        {
            for(int i1=-1;1>=i1;i1=i1+2)//i =-1 和1进行正负d遍历 2*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;
                }
                cout<<"yes"<<endl;
                flag=1;
                break;
            }
            if(flag==1)break;//一旦找到满足就退出
        }
        if(flag==0)
         cout<<"no"<<endl;;
    }
    return 0;
}
/*
a = (k-2*d1+d2)/3

b = (k+d1+d2)/3

c = (k+d1-2*d2)/3
*/