题目的大意是有三只球队,一共有n场比赛,然后现在进行了k场,你不知道输赢,只知道第一和第二的分数差是d1,第二和第三的分数差是d2,那么问你这样比赛是不是可能出现平局?注意每一场比赛没有平局。
做法是:你可以把所有的情况列出来判断是否有一种情况满足。
其实我觉得可以任意设一个赢了x场,然后分几种情况列出等式,判断是否满足条件,这样做的好处是什么呢?这样做就不用害怕某种考虑掉了,还有就是种类太多的情况。这样做判断就很简单了。
#include<iostream> using namespace std; #include<cstring> #include<stdio.h> #include<cmath> #include<algorithm> int main() { int T; __int64 n,k,d1,d2; cin>>T; while(T--) { scanf("%I64d%I64d%I64d%I64d",&n,&k,&d1,&d2); if(n%3!=0){cout<<"no"<<endl;continue;} n-=k; __int64 num1=max(d1,d2); __int64 num2=abs(d1-d2); int sum=0; double x; x=(k+d1+d1+d2)/3.0; if(x-d1>=0&&x-d1-d2>=0&&((__int64)x==x)) if((n-d2-2*d1>=0)&&((n-d2-2*d1)%3==0))sum=1; x=(k+2*d1-d2)/3.0; if(x-d1>=0&&x-d1+d2>=0&&((__int64)x==x)) if((n-num1-num2>=0&&(n-num1-num2)%3==0))sum=1; x=(k+d2-2*d1)/3.0; if(x>=0&&x+d1>=0&&x+d1-d2>=0&&((__int64)x==x)) if((n-d1-d2>=0)&&(n-d1-d2)%3==0)sum=1; x=(k-2*d1-d2)/3.0; if(x>=0&&x+d1>=0&&x+d1+d2>=0&&((__int64)x==x)) if((n-d1-2*d2>=0)&&((n-d1-2*d2)%3==0))sum=1; if(sum==1)cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }