A New Stone Game

15 篇文章 0 订阅

http://poj.org/problem?id=1740

题意:每次可以从N堆石子上取1~该堆石子最大个数,然后将剩下的石子任意分配,可以分配到自己这里,但是不可以分配到石子数为0的堆上,问最后谁能先取完谁就胜利;

分析:

        都可以自己举几个例子,就出来了。

        1.如果只有一堆石子的话,那么肯定是N点,也就是必胜点。

        2.如果有两堆石子(a,b)

              ①a<b。那么先手肯定可以把它转化成(a,a)。后手面临的的是P点,即必败点。

             ②如果是(a,a),先手面临的是P点,即必败点。

        3.如果有三堆石子,先手肯定可以把它转化成(a,a,0)的局面,所以此时是N点。

        4.如果有四堆石子,

            ①如果局势是(a,a,b,b)即所有的石子数目都是成对出现的,那么此时先手必败无疑。因为我们可以进行化简,最后化简成(a,a)的形式,      最后的结果也是先手必败,即P点。

            ②如果局势不是上面说的那种情况,那么先手肯定可以将现在的局势转变成(a,a,a,a),此时是N点,后手必败无疑。


// File Name: poj1740.cpp
// Author: bo_jwolf
// Created Time: 2013年10月06日 星期日 14:04:41

#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>

using namespace std;
const int maxn = 105;
int main(){
	int n, num[ maxn ], temp;
	while( scanf( "%d", &n ) != EOF ){
		if( !n )
			break;
		for( int i = 0; i < maxn; ++i )
			num[ i ] = 0;
		for( int i = 0; i < n; ++i ){
			scanf( "%d", &temp );
			num[ temp ]++;
		}
		int flag = 0;
		for( int i =0 ; i < maxn; ++i ){
			if( num[ i ] & 1 ){
				flag = 1;
				break;
			}
		}
		if( flag )
			printf( "1\n" );
		else
			printf( "0\n" );
	}
return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值