zoukankan      html  css  js  c++  java
  • 【BZOJ1115】[POI2009]石子游戏Kam 阶梯博弈

    【BZOJ1115】[POI2009]石子游戏Kam

    Description

    有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。

    Input

    第一行u表示数据组数。对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an)。 1<=u<=10 1<=n<=1000 0<=ai<=10000

    Output

    u行,若先手必胜输出TAK,否则输出NIE。

    Sample Input

    2
    2
    2 2
    3
    1 2 4

    Sample Output

    NIE
    TAK

    题解:%一发别人的题解吧。

    将所有堆的石子数差分,然后在一个堆中取石子相当于将这个堆中的石子移到后面的堆中去,这就变成了一个阶梯博弈的模型。

    阶梯博弈:n堆石子,每次可以将在一堆石子中取若干个移动到前面一堆中去,不能操作者输。

    结论:第偶数堆石子是没有用的,因为你怎么移对面就能怎么移,所以相当于在奇数堆中玩NIM游戏。

    本题就是一个倒过来的阶梯博弈。

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    int n,s;
    int v[1010],c[1010];
    void work()
    {
    	scanf("%d",&n),s=0;
    	int i;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&v[i]),c[i]=v[i]-v[i-1];
    		if((n-i+1)&1)	s^=c[i];
    	}
    	if(s)	printf("TAK
    ");
    	else	printf("NIE
    ");
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)	work();
    	return 0;
    }
  • 相关阅读:
    百度影音盒插入论坛帖子自动播放代码及方法
    vFloppy1.5-虚拟启动软盘
    飞秋的实现原理
    博客盈利请先考虑这七点
    下载站运行广告合作exe文件然后再运行程序文件的bat
    木马病毒是什么以及手工清除木马病毒具体步骤
    网站盈利模式分析分类
    软件更新原理
    浅析php学习的路线图
    网页常用分享代码大全(前端必备)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7434592.html
Copyright © 2011-2022 走看看