• HDU 4315 阶梯博弈变形


    n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过、重叠其他棋子,谁将红色棋子移到顶部谁赢。

    由于只能往上爬,所以很像阶梯博弈。这题有2个限制,棋子不能重叠,有红棋存在

    首先不考虑红色棋,那么我们可以视棋于棋间的距离为石子堆,这样棋子两两分组就是奇数堆,组与组间的距离就是偶数堆。

    有个特殊情况k=2时,此时第一个区间石子数要减小1,不能移完,否则后手直接就能取胜了。

    /** @Date    : 2017-10-13 23:13:24
      * @FileName: HDU 4315 阶梯博弈变形.cpp
      * @Platform: Windows
      * @Author  : Lweleth (SoungEarlf@gmail.com)
      * @Link    : https://github.com/
      * @Version : $Id$
      */
    #include <bits/stdc++.h>
    #define LL long long
    #define PII pair
    #define MP(x, y) make_pair((x),(y))
    #define fi first
    #define se second
    #define PB(x) push_back((x))
    #define MMG(x) memset((x), -1,sizeof(x))
    #define MMF(x) memset((x),0,sizeof(x))
    #define MMI(x) memset((x), INF, sizeof(x))
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int N = 1e3+20;
    const double eps = 1e-8;
    
    
    int a[N];
    int main()
    {
    	int n, k;
    	while(~scanf("%d%d", &n, &k))
    	{
    		a[0] = 0;
    		for(int i = 1; i <= n; i++)
    		{
    			scanf("%d", a + i);
    		}
    		if(k == 1)
    		{
    			printf("Alice
    ");
    			continue;
    		}
    		int sgs = 0;
    		if(n % 2)
    		{
    			for(int i = 0; i + 1 <= n; i += 2)
    				sgs ^= a[i + 1] - a[i] - 1;
    			if(k != 2)//特殊情况
    				sgs ^= a[1] ^ (a[1] - 1);
    		}
    		else 
    		{
    			for(int i = 1; i + 1<= n; i += 2)
    				sgs ^= a[i + 1] - a[i] - 1;
    		}
    		if(sgs)
    			printf("Alice
    ");
    		else printf("Bob
    ");
    	}
        return 0;
    }//两两分组 
    
  • 相关阅读:
    第一次结对编程作业
    第7组 团队展示
    第一次个人编程作业
    js学习笔记(1)
    第一次博客作业
    期末总结
    王者光耀团队作业
    第四次c++作业
    c++第三次作业
    第一次编程作业
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/7679257.html
Copyright © 2020-2023  润新知