显然将 \(a\) 降序排序后,然后依次放到坐标系中,每次操作相当于把 \(x,y\) 轴之一往上或右平移一个单位
考虑构造一种后手必胜的方案
后手可以把路线控制在 \(y = x\) 上,然后走到一个端点,此时轮到先手
设还可以向上走 \(b\),向右走 \(c\)
若 \(b,c\) 均为偶数则后手必胜
考虑证明剩下的均为先手必胜
\(b,c\) 其中之一必为奇数,那么先手往奇数的方向走一个单位,那么另外的方向上的数就变为 \(0\),而该方向的长度减 \(1\) 变为偶数
可以发现变成了后手必胜的局面
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, a[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
reverse(a + 1, a + n + 1);
int x = 1, b = 0, c = 0;
while (x < n && a[x + 1] >= x + 1)
x++;
b = a[x] - x;
while (a[x + c + 1] == x)
c++;
printf("%s\n", (b|c)&1 ? "First" : "Second");
}