poj1740 A New Stone Game 博弈

6 篇文章 0 订阅

题目在此,链接

题意:

对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。
最后谁无子可取即输。

分析:

首先看两堆:1 1 的状态肯定是先手输~~但是俩数不一样的话就是先手赢了。。

再看三堆:1 1 1的状态肯定是先手赢,1 2 1也是先手赢。。。1 2 2也是先手赢。。总之都是先手赢。。

再看四堆:1 1 2 2 这样的肯定是先手输。。1 1 2 3 这样的就是先手赢了。。。1 2 3 4是先手赢。。

再看五堆:1 1 1 1 1 是先手赢。。1 1 1 1 2 先手赢。。。。…………都是先手赢。。1 2 3 4 1  也是先手赢。。。。各种先手赢。。


由上我们可以得出结论。。。堆的个数为奇数的情况下。。各种先手赢。总是先手赢。。。堆的数目为偶数的情况下。。如果当前各个堆的石头数目能够对称。。也就是说。。把石头数目排序之后。。第1、2堆数量相等。。3、4堆数量相等,5、6堆数量相等………………这样的情况下。。先手必输。。其他情况都是先手赢。。。


代码:写的不是太好。。其实可以用bool型,通过翻转来解决。。效率快多了。。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int n;
	int stone[11], num[101];
	while (scanf("%d", &n), n)
	{
		int i;
		memset(num, 0, sizeof(num));
		for (i=0; i<n; i++)
		{
			scanf("%d", &stone[i]);
			num[stone[i]] ++;
		}
		sort(stone, stone+1);
		

		int number = 0;

		for (i=1; i<=100; i++)
			if (num[i] % 2 == 1)
				number ++;

		if (number) puts("1");
		else puts("0");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值