Codeforces Round #658 (Div. 2) 参与排名人数14674
[codeforces 1382B] Sequential Nim 博弈(参赛者面对堆的石块数量大于1时,赢)
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1382/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Sequential Nim | GNU C++17 | Accepted | 46 ms | 4300 KB |
题目大意:给出一个数组,数组元素值代表石块个数,两个选手在轮流进行取石游戏,需从序号最小到序号逐渐增大取起,每堆石块至少要取一块。最后无石块可取的人输。输出胜者。
基本思路:在模拟样例中发现:若每堆石块数量都是1,那么按部就班。若石块数量有大于1的堆,这样处理,自序号小的堆开始,遇到第一个石块数量大于1的堆(理由,输赢其实只差一步,面对石块数量大于1的堆时,参赛者可以选择多走一步,还是少走一步,所以稳赢),此时,轮到的参赛者赢。
样例模拟如下:
3
2 5 4
First
Fisrt(F),Second(S)
位置1 2 3
数值2 5 4
先手F
F赢
8
1 1 1 1 1 1 1 1
Second
位置1 2 3 4 5 6 7 8
数值1 1 1 1 1 1 1 1
先手F S F S F S F S
S赢
6
1 2 3 4 5 6
Second
位置1 2 3 4 5 6
数值1 2 3 4 5 6
先手F S
S赢
6
1 1 2 1 2 2
First
位置1 2 3 4 5 6
数值1 1 2 1 2 2
先手F S F
F赢
1
1000000000
First
位置1
数值1000000000
先手F
F赢
5
1 2 2 1 1
Second
位置1 2 3 4 5
数值1 2 2 1 1
先手F S
S赢
3
1 1 1
First
位置1 2 3
数值1 1 1
先手F S F
F赢
AC代码如下:
#include <stdio.h>
#define maxn 100010
int a[maxn];
int main(){
int t,n,flag,cnt,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
flag=0,cnt=0;
for(i=1;i<=n;i++)
if(!flag&&a[i]==1)cnt++;
else{//石块数量有大于1的堆
flag=1;
if(cnt%2==0)printf("First\n");
else printf("Second\n");
break;
}
if(!flag){//每堆石块数量都是1
if(cnt%2)printf("First\n");
else printf("Second\n");
}
}
return 0;
}