题解 CF893A 【Chess For Three】

rui_er

2020-09-03 20:28:58

Solution

题意简述:三个人轮流下棋,每次输的当旁观者,判断题目给出的胜者是否是旁观者(即条件自相矛盾)。 --- 思路:没啥意思,数据范围不大,考虑模拟。 我们记录 $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; } ```