参考博客

先讲一下Georgia and Bob:

题意:

给你一排球的位置(全部在x轴上操作),你要把他们都移动到0位置,每次至少走一步且不能超过他前面(下标小)的那个球,谁不能操作谁就输了

题解:

当n为偶数的时候,假设当每个球都相互挨着没有间隙,那么两两一组,一组中前面那个走到哪,后面那个跟上就可以了,先手必输

如果球与球之间有间隙,那么俩俩球之间的距离可以当作尼姆博弈中取石子游戏中一堆石子的石子数,用尼姆博弈判断一下就可以了

可以说先手赢不赢光和两球之间的距离有关,如果俩俩球之间的的距离都是0的话,那么谁胜利就已经知道了

当n为奇数的时候,可以先把第一个球走到终点(那么第一个球到终点的距离可以算成尼姆博弈的一堆石子),假设后面的球还是两两挨着,那么只需要用尼姆博弈判断一下第一个球怎么走就可以了

如果后面的球有间隔,那么可以把球与球之间的距离一起异或就可以了

代码:

 1 #include<cstdio>
2
3 #include<iostream>
4
5 #include<algorithm>
6
7 #include<cstring>
8
9 using namespace std;
10
11 int a[1010],b[1010];
12
13 int main()
14
15 {
16
17 int t;
18
19 scanf("%d",&t);
20
21 while(t--)
22
23 {
24
25 int n;
26
27 b[0]=0;
28
29 scanf("%d",&n);
30
31 for(int i=1; i<=n; i++)
32
33 scanf("%d",&a[i]);
34
35 sort(a+1,a+n+1);
36
37 for(int i=1; i<=n; i++)
38
39 b[i]=a[i]-a[i-1]-1;
40
41 int s=0;
42
43 for(int i=n; i>0; i-=2)
44
45 s^=b[i];
46
47 if(s==0)
48
49 puts("Bob will win");
50
51 else
52
53 puts("Georgia will win");
54
55 }
56
57 return 0;
58
59 }

Climbing the Hill题意:

给你n个球的位置(x坐标),每一个球可以往前(下标减小的位置)移动,但是不能超过他前面那个球的位置,除了0这个位置之外其他位置只能有一个球,看谁能把红球移到0位置,Alice先走,Bob后走,谁把红球移动到0位置,就输出那个人的名字(第k个球就是红球)

题解:

当k==1的时候先手必胜

当n为偶数,k!=1的时候,那么根据上一道题我们只需要对所有球两两分组,对每一组球的间距异或一下,如果是0,那么Bob赢,反之亦然

你可能要问了,上一道题目所有球都要到达0这个位置,这一道题红球到了就结束了,这没有区别吗?

其实是没有区别的,因为一旦每一组球的间距都变成0的话,那么一组之间的移动不改变谁获胜

举个例子如果 
n==4   k==3 那么 先手怎么走你怎么走即可,你只需要把第2个棋子在要进入山顶的时候把他放在靠近山顶一步的位置。那么相当于这一步给了对方,剩下的还是对方走什么你走什么就可以。对两两之间的配对异或就行。
n==4  k==4这样的话两两配对,对方走第一个你走第二个就可以。对两两之间的配对异或就行。
当总数n为奇数时(k!=1),先吧第一个点走道终点,然后就是偶数的情况了,然后考虑怎么将他们两两挨在一起(注意不用所有点都挨在一起)
  这是就是当n为偶(k!=1)计算a[i+1]与a[i]的距离,for(i+=2),这样我们就将它化成几点nim游戏问题,将a[i+1]与a[i]的距离左为每堆石子的个数
  当n为奇数,就是a自己当作一个堆,然后还是将a[i+1]与a[i]的距离左为每堆石子的个数,轮到谁没有石子取了,谁就输啦!当然注意特殊情况就是当n为奇数的时候,k如果为2,前面我们说当n为奇数是直接将第一个直接走到终点,但因为第二哥是k了,所以第一个a[i]不能走道终点,只能走道里终点最近的位置也就是只能走a[i]-1步,所以就是将a[i]-1当作一个堆。
 
代码:
 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1005;
7 int v[maxn];
8 int main()
9 {
10 int n,k;
11 while(~scanf("%d%d",&n,&k))
12 {
13 for(int i=1;i<=n;++i)
14 {
15 scanf("%d",&v[i]);
16 }
17 if(k==1)
18 printf("Alice\n");
19 else
20 {
21 if(n%2==0)
22 {
23 int flag=0;
24 for(int i=2;i<=n;i+=2)
25 {
26 flag^=(v[i]-v[i-1]-1);
27 }
28 if(flag==0)
29 printf("Bob\n");
30 else printf("Alice\n");
31 }
32 else if(n%2)
33 {
34 int flag=v[1];
35 if(k==2) flag-=1;
36 for(int i=3;i<=n;i+=2)
37 {
38 flag^=(v[i]-v[i-1]-1);
39 }
40 if(flag==0)
41 printf("Bob\n");
42 else printf("Alice\n");
43 }
44 }
45 }
46 return 0;
47 }

hdu 4315 Climbing the Hill && poj 1704 Georgia and Bob阶梯博弈--尼姆博弈的更多相关文章

  1. poj 1704 Georgia and Bob(阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9363   Accepted: 3055 D ...

  2. POJ 1704 Georgia and Bob(阶梯Nim博弈)

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11357   Accepted: 3749 Description Geor ...

  3. POJ 1704 Georgia and Bob [阶梯Nim]

    题意: 每次可以向左移动一个棋子任意步,不能跨过棋子 很巧妙的转化,把棋子间的空隙看成石子堆 然后裸阶梯Nim #include <iostream> #include <cstdi ...

  4. HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)

    Climbing the Hill Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Su ...

  5. POJ 1704 Georgia and Bob(阶梯博弈+证明)

    POJ 1704 题目链接 关于阶梯博弈有如下定理: 将所有奇数阶梯看作n堆石头,做Nim,将石头从奇数堆移动到偶数堆看作取走石头,同样地,异或值不为0(利己态)时,先手必胜. 定理证明看此博:htt ...

  6. POJ 1704 Georgia and Bob(阶梯博弈)题解

    题意:有一个一维棋盘,有格子标号1,2,3,......有n个棋子放在一些格子上,两人博弈,只能将棋子向左移,不能和其他棋子重叠,也不能跨越其他棋子,不能超越边界,不能走的人输 思路:可以用阶梯博弈来 ...

  7. hdu 4315 Climbing the Hill(阶梯博弈转nim博弈)

    Climbing the Hill Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. poj 1704 Georgia and Bob(阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8656   Accepted: 2751 D ...

  9. [原博客] POJ 1704 Georgia and Bob

    题目链接题意:如图,Georgia和Bob在玩游戏.一个无限长的棋盘上有N个旗子,第i个棋子的位置可以用Pi表示.现在Georgia先走.每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他 ...

随机推荐

  1. python模块详解 | unittest(单元测试框架)(持续更新中)

    目录: why unittest? unittest的四个重要概念 加载测试用例的三个方法 自动加载测试用例 忽略测试和预期失败 生成html测试报告 why unittest? 简介: Unitte ...

  2. git 遇到 fatal: loose object xxxx (stored in .git/objects/cb/xxxx) is corrupt 问题

    我的git版本是2.3.x,用下面这个参考链接的方法也可以解决 参考blog

  3. yum -y install gnuplot

    [root@test~]# yum -y install gnuplotLoaded plugins: fastestmirrorLoading mirror speeds from cached h ...

  4. SDUST数据结构 - chap4 串

    函数题: 6-1 查找子串: 裁判测试程序样例: #include <stdio.h> #define MAXS 30 char *search(char *s, char *t); vo ...

  5. C语言字符串结束符“\0”

    介绍 '\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写.'\0'就是 字符串结束标志. '\0'是转译字符,意思是告诉编译器,这不是字符0,而是空字符.空字符\0对应 ...

  6. 【分享】每个 Web 开发者在 2021 年必须拥有 15 个 VSCode 扩展

    为什么VSCode如此受欢迎 Visual Studio Code在开发人员中迅速流行起来,它是最流行的开发环境,可定制性是其流行的原因之一. 因此,如果你正在使用VSCode,这里有一个扩展列表,你 ...

  7. CODING 再携手腾讯云 Serverless,让开发者跑步上云

    近年来,腾讯云持续在云原生领域打磨和完善产品矩阵,致力于为开发者上云提供更好的产品和服务.继前段时间 CODING CI 助力腾讯云 Serverless 全新应用控制台.持续保障 Serverles ...

  8. 一致性哈希算法C#实现

    一致性hash实现,以下实现没有考虑多线程情况,也就是没有加锁,需要的可以自行加上.因为换行的问题,阅读不太方便,可以拷贝到本地再读. 1 /// <summary> 2 /// 一致性哈 ...

  9. http状态码、错误分析

    客户端的每一次请求,服务器都必须给出回应.回应包括 HTTP 状态码和数据两部分. HTTP状态码五大类: 状态码 响应类别 出现原因 1XX  信息性状态码(Informational) 服务器正在 ...

  10. java 文件转成pdf文件 预览

    一.前端代码 //预览功能 preview: function () { //判断选中状态 var ids =""; var num = 0; $(".checkbox& ...