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

京公网安备 11010502036488号