题目大意:有$4n$个硬币,放在$2n$个位置(即放成两排),有两个人,轮流取。第一个人取上面的,第二个人取下面的,每个人只可以取两个人都没取过的位置。若硬币正面向上,为$1$,反面为$0$。把取得的硬币按取得顺序排成一列,这个二进制数大的人赢,为有没有先手必胜策略。
题解:贪心,一定是先取正面向上的,如果有两个都是正面朝上的就取,不然去自己的一边是正面向上的,再不然就取自己的反面向上而对方正面向上的(让对方没法取)
卡点:字符串循环时写成了$1sim len$(应该为$0sim len - 1$)
C++ Code:
#include <cstdio> int n; char s[2000010], p[2000010]; int ans[5]; int he[2]; int main() { scanf("%d", &n); scanf("%s%s", s, p); for (int i = 0; i < n * 2; i++) { if (s[i] == 'U') { if (p[i] == 'U') ans[3]++; else ans[2]++; } else { if (p[i] == 'U') ans[1]++; else ans[0]++; } } int now = 1; for (int i = 1; i <= n * 2; i++) { if (ans[3]) he[now]++, ans[3]--; else if (ans[1 << now]) he[now]++, ans[1 << now]--; else if (ans[3 - (1 << now)]) ans[3 - (1 << now)]--; else ans[0]--; now ^= 1; } if (he[1] > he[0]) puts("clccle trl!"); else puts(he[1] < he[0] ? "sarlendy tql!" : "orz sarlendy!"); return 0; }