题目大意:
给你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);
}
else ans^=(a[0]-0);
}
for(int i=c;i<n;i+=2)
{
ans^=(a[i+1]-a[i]-1);
}
printf(ans?"Alice\n":"Bob\n");
}
return 0;
}