Climbing the Hill HDU - 4315+(阶梯博弈,哈哈,懂了懂了)

 题目大意:
 给你n个人的位置,以及国王的位置k,从小到大排序后,国王的位置在第k个;
 把国王送到顶端的人获胜,Alice先,Bob后;
 解析过程:
 第一个思路是讨论[1,k][k+1,n]的情况,然后再综合讨论; 
 提交的代码wa了,想了想有许多状态没有考虑;所以就果断放弃了,百度了题解,然而题解
 只有代码,没有具体到细节的解释,所以我就在自己的理解上,写了写这个具体的理解。
 
 这道题Georgia and Bob POJ - 1704和本题有很大的相似之处,不同点在哪里?本题多
 了一个变量k,(还有最重要的是本题的最上面的位置的移动上线是top,而不是1!);
 那我们就来讨论一下k和这个移动上线top;
 (1)当k==1时,显然Alice获胜;
 (2)当k==2时,
      ”Georgia and Bob POJ - 1704“这道题对问题的出理思路是:
      n分奇偶,两两配对,异或取值
      n为奇数时,第1个位置a的sg值为(a-1);-1是因为最大上限时1;
      而本题我们的最大上限是0;
      
      可是当n为奇数时,k==2;处于第一个位置a的和假想的上限位置的元素配对;
      试想{[top],[],[],[],[a[0]]};a[0](a[0]==4)的最大移动距离是什么?
	  是4? ;如果是4,就是将a[0]移到[top],那么没有了[a[0]],在第二个位子的
	  国王显然可以直接移到top了,这是不行的,所以a[0]的sg值是a[0]-1; 
      当n为偶数时,第二个元素就可以和第一元素匹配了;
 (3)当k>=3时,   
     当n为奇数时,处于第一个位置的元素a,它的sg值时a-0;想想为什么把;
    
  
  因为位于第一个位置的石子可以移到top上,现在讨论(先手胜利的最终局面如何处理)
 (1) 当n为偶数,king的位置为偶数时;
  例如:
  {[top][1][2][3][4][5][k]};例如这样,那么到B放置棋子,B会取走奇数位置的棋子,
  恰好A会取走偶数位置的棋子;
(2)当n为偶数,king的位置为奇数时;	
  例如:
  {[top][1][][2][3][][][k]}; -->(转化)-->{[1][2]]},sg1=1; {[3][k]},sg2=2;
  sg1^sg2=1 !=0;所以A会胜利,
  如何移动呢?
  A将k移到第6个位置,[top][1][][2][3][][k][];(对称局势)
  (已经验证,A可以取胜,自己验证一下)
  (3)当n为奇数,king的位置为奇数时,等同于 (1)
   (4) 当n为奇数,king的位置为偶数时,等同于(2
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int num=1e3+10;
int a[num];
int main()
{
	int n,k,c,ans;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
		if(k==1){
			printf("Alice\n");continue;
		}
		sort(a,a+n);
		ans=c=0;
		if(n%2) {
			c=1;
			if(k==2){
				ans^= (a[0]-1>0?(a[0]-1):0);//这里为什么是a[0]-1呢?
				//试想{[top],[],[],[],[a[0]]};a[0](a[0]==4)的最大移
				//动距离是什么?
				//是4? ;如果是4,就是将a[0]移到[top],
				//那么没有了[a[0]],在第二个位子
				//的国王显然可以直接移到top了,这是不行的,
				//所以a[0]的sg值是a[0]-1; 
			}
			else ans^=(a[0]-0);
			//如果k>=3;a[0]的最大移动距离就是a[0]了,即a[0]的sg值也就是sg值了; 
		}
		
		for(int i=c;i<n;i+=2)
		{
			ans^=(a[i+1]-a[i]-1);
		}
		
		printf(ans?"Alice\n":"Bob\n");
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值