很简单的题,但是之前题目没说清楚
我一直以为第一名一定比第二名多赢d1局,因为这个跪了3次
后来题目补充说明才发现...
知道题意就很简单了,列出几个方程和不等式就行了
设最后每个队的分数为ave,第k场比赛后队伍一的分数为x
则可以得到下面四组不等式:
1、
三个队伍k场比赛后分数为:x, x-d1, x-d1-d2
3*x-2*d1-d2=k;
ave = n/3;
ave >= x;
x >= d1+d2;
2、
三个队伍k场比赛后分数为:x, x-d1, x-d1+d2
3*x-2*d1+d2=k;
ave = n/3;
ave >= x;
ave >= x-d1+d2;
x >= d1;
3、
三个队伍k场比赛后分数为:x, x+d1, x+d1-d2
3*x+2*d1-d2=k;
ave = n/3;
ave >= x+d1;
x+d1 >= d2;
4、
三个队伍k场比赛后分数为:x, x+d1, x+d1+d2
3*x+2*d1+d2=k;
ave = n/3;
ave >= x+d1+d2;
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
using namespace std;
LL T, n, k, d1, d2, ave, x, ok;
bool judge1() {
if(n%3==0 && (k+2*d1+d2)%3==0) {
ave = n/3;
x = (k+2*d1+d2)/3;
if(ave>=x && x>=(d1+d2))
return true;
}
return false;
}
bool judge2() {
if(n%3==0 && (k+2*d1-d2)%3==0 && (k+2*d1-d2)>=0) {
ave = n/3;
x = (k+2*d1-d2)/3;
if(ave>=x && x>=d1 && ave>=(x-d1+d2))
return true;
}
return false;
}
bool judge3() {
if(n%3==0 && (k-2*d1+d2)%3==0 && (k-2*d1+d2)>=0) {
ave = n/3;
x = (k-2*d1+d2)/3;
if(ave>=(x+d1) && (x+d1)>=d2)
return true;
}
return false;
}
bool judge4() {
if(n%3==0 && (k-2*d1-d2)%3==0 && (k-2*d1-d2)>=0) {
ave = n/3;
x = (k-2*d1-d2)/3;
if(ave>=(x+d1+d2))
return true;
}
return false;
}
int main(void) {
cin >> T;
while(T--) {
cin >> n >> k >> d1 >> d2;
if(judge1() || judge2() || judge3() || judge4())
cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}