一个新的取石子游戏
A 和B准备玩一个游戏, 开始有N个盘子, 每个盘子上有一些石子, A B轮流取石子, 每次 取石子的人必须从N个盘子中, 选择一个盘子,然后拿找至少一个石子, ,然后将拿到的石子可以以任意方式分配到剩余的其他盘子中, 也可以不分配,直接丢掉,再也不能取石子的那个人为负。
Input:
输入第一个正整数 N 接下来一行有N个数字,表示第i个盘子中有i个石子, 每个数字不会超过一百
output:
A是先手,如果A能赢得比赛输出1 否则输出0
解题思路: 分析必败态
1、如果堆为偶数,但是不成对,例如1 2 3 4 5 6 可以把6分配一下 变成 1 1 3 3 5 5 先手胜
如果取石子的数目是成对偶数的, 1 1 3 3 5 5 6 6 那么后手必胜 先手必败
2、 如果堆数不成对为奇数, 如1 2 3 4 5 先后可以 把5 分配给前面四个 那么就变成 2 2 4 4 先手必胜
看代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000] ;
int main()
{/*题目大意
A=有N堆石子,柿子树任意, A B两个人去取石子
至少取一个数量不限, 直到最后一个人不能取为负 */
int n;
while(scanf("%d", &n) && n)
{//解题思路,必败态只有一种, 石子成对出现,必败
bool flag ;
//输入数据
for( int i = 0 ; i < n ; i++)
{
scanf("%d", &a[i]);
}
if(n%2 == 0)
{
flag = true;
for(int i = 0 ; i < n && flag; i+=2)
{
if(a[i] != a[i+1])
{
flag = false;
}
}
printf("%d\n", flag ? 0: 1);
}
else{ printf("1\n");};
}
return 0 ;
}