hdu 4315 Climbing the Hill && poj 1704 Georgia and Bob阶梯博弈--尼姆博弈
先讲一下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的话,那么一组之间的移动不改变谁获胜
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阶梯博弈--尼姆博弈的更多相关文章
- poj 1704 Georgia and Bob(阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9363 Accepted: 3055 D ...
- POJ 1704 Georgia and Bob(阶梯Nim博弈)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11357 Accepted: 3749 Description Geor ...
- POJ 1704 Georgia and Bob [阶梯Nim]
题意: 每次可以向左移动一个棋子任意步,不能跨过棋子 很巧妙的转化,把棋子间的空隙看成石子堆 然后裸阶梯Nim #include <iostream> #include <cstdi ...
- HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)
Climbing the Hill Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Su ...
- POJ 1704 Georgia and Bob(阶梯博弈+证明)
POJ 1704 题目链接 关于阶梯博弈有如下定理: 将所有奇数阶梯看作n堆石头,做Nim,将石头从奇数堆移动到偶数堆看作取走石头,同样地,异或值不为0(利己态)时,先手必胜. 定理证明看此博:htt ...
- POJ 1704 Georgia and Bob(阶梯博弈)题解
题意:有一个一维棋盘,有格子标号1,2,3,......有n个棋子放在一些格子上,两人博弈,只能将棋子向左移,不能和其他棋子重叠,也不能跨越其他棋子,不能超越边界,不能走的人输 思路:可以用阶梯博弈来 ...
- hdu 4315 Climbing the Hill(阶梯博弈转nim博弈)
Climbing the Hill Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- poj 1704 Georgia and Bob(阶梯博弈)
Georgia and Bob Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8656 Accepted: 2751 D ...
- [原博客] POJ 1704 Georgia and Bob
题目链接题意:如图,Georgia和Bob在玩游戏.一个无限长的棋盘上有N个旗子,第i个棋子的位置可以用Pi表示.现在Georgia先走.每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他 ...
随机推荐
- 剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理
Q:把一个字符串转换为整数. A1:一个普通但漏洞百出的解法. int StrToInt(char* str) { int number = 0; while (*str != 0) { number ...
- Linux 服务器安装node环境
Linux 装 node 环境 我的是 CentOS 查看服务器是多少位系统 getconf LONG_BIT 下载地址, 下载对应的版本: http://nodejs.cn/download/ 我这 ...
- ctfhub技能树—信息泄露—备份文件下载—vim缓存
打开靶机 查看页面信息 在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容 以 index.php 为例:第 ...
- Flask+pin
Flask+SSTI的新火花 记一次buu刷题记和回顾祥云杯被虐出屎的经历.题目:[GYCTF2020]FlaskApp 一 题目初见 朴实无华的页面,一个base64的小程序页面 看到有提示. 我就 ...
- 一文读懂 Kubernetes APIServer 原理
前言 整个Kubernetes技术体系由声明式API以及Controller构成,而kube-apiserver是Kubernetes的声明式api server,并为其它组件交互提供了桥梁.因此加深 ...
- oracle rac与单实例DG切换
1.主库查看状态(RAC库) SQL> select database_role,switchover_status from v$database; DATABASE_ROLE SWITCHO ...
- MyBatis初级实战之六:一对多关联查询
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 前端面试准备笔记之JavaScript(02)
01. this的典型应用场景 this在各个场景中取什么值,是在函数执行的时候确认的,不是在定义的时候确认的. 普通函数执行 返回window function fn1() { console.lo ...
- postgres多知识点综合案例
使用到的知识点: 1.使用with临时存储sql语句,格式[with as xxx(), as xxx2() ]以减少代码: 2.使用round()取小数点后几位: 3.使用to_char()将时间格 ...
- NAT模式、路由模式、桥接模式的区别
NAT模式 NAT模式概述 NAT是"Network Address Translation"的缩写,中文意思是"网络地址转换",它允许一个整体机构以一个公用I ...