原题传送门
这应该算是一个比较基础得博弈把
把1分成两类,
- 某一个位置上只有一行拥有1
- 某一个位置上两行都有1
这两类1应该是可以分开来讨论的,不相互影响,先统计一下两种1的个数
一开始可以令两个人都尽可能取两行都有的1
然后如果两行都有的1的个数是奇数的话先手改变
然后的阶段是两个人尽可能取自己这一行有的1
那么为了方便,如果先手在上一个阶段改变,我让第二个人先取一个1,把先手改回来
然后讨论两行的1个数大小关系就可以得到答案
记第一行有
s
1
s1
s1个1,第二行有
s
2
s2
s2个1
-
s
1
>
s
2
s1>s2
s1>s2,
puts("First")
-
s
1
=
s
2
s1=s2
s1=s2,
puts("Draw")
-
s
1
=
s
2
+
1
s1=s2+1
s1=s2+1,
puts("Draw")
-
s
1
>
s
2
+
1
s1>s2+1
s1>s2+1,
puts("Second")
Code:
#include <bits/stdc++.h>
#define maxn 2000010
using namespace std;
int n, a[maxn], b[maxn], s1, s2, s3;
int get(){
char c = getchar();
for (; c != '0' && c != '1'; c = getchar());
return c == '1';
}
int main(){
scanf("%d", &n);
for (int i = 1; i <= (n << 1); ++i) a[i] = get();
for (int i = 1; i <= (n << 1); ++i) b[i] = get();
for (int i = 1; i <= (n << 1); ++i)
if (a[i] && !b[i]) ++s1; else
if (!a[i] && b[i]) ++s2; else
if (a[i] && b[i]) ++s3;
if (s3 & 1) --s2;
if (s1 > s2) puts("First"); else
if (s2 > s1 + 1) puts("Second"); else puts("Draw");
return 0;
}