Predict Outcome of the Game

Predict Outcome of the Game

Created by LXC on Tue May 9 10:44:46 2023

https://codeforces.com/problemset/problem/451/C

ranting: 1700

tag: brute force, implementation, math

题意

有三只球队举行比赛

共计n场比赛,每场比赛选两支队伍参与,必有一方会胜利。

现在已经进行了k场比赛,已知第一二支队伍的胜场之差的绝对值为d1,第二三支队伍的胜场之差的绝对值为d2

问能否存在一种可能,在n场比赛后每支队伍的胜场一样。

题解

设k场比赛后三支队伍的胜场分别是x,y,z

那么有:
x+y+z = k
|x-y| = d1
|y-z| = d2

取绝对值后形成4个三元一次方程。
分别解出x,y,z。
只要满足0<=x<=n/3,0<=y<=n/3,0<=z<=n/3即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#include <bits/stdc++.h>
// #define SINGLE_INPUT
#define ll long long
#define N 500005
#define MOD 998244353
using namespace std;

ll n, k, d1, d2;

bool check(ll x, ll y, ll z) {
return (x % 3 == 0 && y % 3 == 0 && z % 3 == 0 && 0 <= x / 3 &&
0 <= y / 3 && 0 <= z / 3 && x / 3 <= n / 3 && y / 3 <= n / 3 &&
z / 3 <= n / 3);
}

void sol() {
cin >> n >> k >> d1 >> d2;
if (n % 3) {
cout << "no\n";
return;
}
ll x1 = k + 2 * d1 + d2, y1 = k - d1 + d2, z1 = k - d1 - 2 * d2;
ll x2 = k - 2 * d1 + d2, y2 = k + d1 + d2, z2 = k + d1 - 2 * d2;
ll x3 = k + 2 * d1 - d2, y3 = k - d1 - d2, z3 = k - d1 + 2 * d2;
ll x4 = k - 2 * d1 - d2, y4 = k + d1 - d2, z4 = k + d1 + 2 * d2;
cout << ((check(x1, y1, z1) || check(x2, y2, z2) || check(x3, y3, z3) ||
check(x4, y4, z4))
? "yes\n"
: "no\n");
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#ifndef SINGLE_INPUT
int t;
cin >> t;
while (t--) {
sol();
}
#else
sol();
#endif
return 0;
}