题解 CF893A 【Chess For Three】
rui_er
2020-09-03 20:28:58
题意简述:三个人轮流下棋,每次输的当旁观者,判断题目给出的胜者是否是旁观者(即条件自相矛盾)。
---
思路:没啥意思,数据范围不大,考虑模拟。
我们记录 $sp$ 表示当前旁观者编号,初始值为 $3$。对于每一局,如果输入的胜者是旁观者,直接输出 `NO` 并退出。否则我们更新 $sp$。
由于负者变为旁观者,因此我们要取那个既不是胜者又不是原来的 $sp$ 的人当旁观者。我们可以判断原来的 $sp$,使用另两个编号的和减去胜者即可得到负者的编号。
如果到最后都没有退出,输出 `YES`。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。
---
代码:
```cpp
//By: Luogu@rui_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;
}
```