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 */