题解 [email protected]洛谷 | [email protected] 【Chess For Three】

题意简述:三个人轮流下棋,每次输的当旁观者,判断题目给出的胜者是否是旁观者(即条件自相矛盾)。


思路:没啥意思,数据范围不大,考虑模拟。

我们记录 spsp 表示当前旁观者编号,初始值为 33。对于每一局,如果输入的胜者是旁观者,直接输出 NO 并退出。否则我们更新 spsp

由于负者变为旁观者,因此我们要取那个既不是胜者又不是原来的 spsp 的人当旁观者。我们可以判断原来的 spsp,使用另两个编号的和减去胜者即可得到负者的编号。

如果到最后都没有退出,输出 YES

时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)


代码:

//By: [email protected]_er(122461)
#include <bits/stdc++.h>
using namespace std;

int n, a, sp;

int main() {
	scanf("%d", &n);
	sp = 3;
	for(int i=1;i<=n;i++) {
		scanf("%d", &a);
		if(a == sp) return puts("NO"), 0;
		if(sp == 1) sp = 5 - a;
		else if(sp == 2) sp = 4 - a;
		else sp = 3 - a;
	}
	puts("YES");
	return 0;
}