思路:
这道题怎么说呢,我起初是天真的查找奇偶数,后来发现发现想错了,就查找非1数个数和数字1的个数,但搞了半天比较迷,最后发现规律:
- 若总数n1,则一定是Firsrt;
- 若总数n1,查找第一个非1数前的1的个数s;可以发现只有在s0并且s是偶数个时是Second;其他的一定是Firsrt。
根据题解的规律:
记录数组中所有1的个数y,以及第一个非1数的位置f;
- 若总数ny,若是奇数则一定是Firsrt;若是偶数则一定是Second;
- 若总数ny,f是偶数时则一定是Second;f是奇数时则一定是是Firsrt。(谁先发现第一个石头数不是1的石堆,谁就掌握了获胜权)
其实二者相差不多。
AC:
#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int main() {
int t;
cin >> t;
while(t--)
{
int n, s = 0, d = 1;
cin >> n;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if(a[i] == 1 && d && i != n - 1)
s++;
else
d = 0;
}
if(n == 1)
cout << "First" << endl;
else
{
if(s && s % 2)
cout << "Second" << endl;
else
cout << "First" << endl;
}
}
return 0;
}
代码:
#include <iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int k;
cin >> k;
int y=0,f=0,c;
for(int i=0;i<k;i++)
{
cin>>c;
if(c==1)
y++;
else if(c!=1&&!f)
f=i+1;
}
if(y==k)
{
if(y%2)
cout <<"First"<<endl;
else
cout <<"Second"<<endl;
}
else
{
if(f%2==0)
cout <<"Second"<<endl;
else
cout <<"First"<<endl;
}
}
}