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先走.每个人每一次可以把一枚棋子向左移动任意个格子,但是不能超越其他 ...
随机推荐
- 【Problems】Could not set property 'id' of 'xxx' with value '' Cause argument type mismatch
一个问题:向comment表添加记录时,报错, 无法设置值. reflection.ReflectionException: Could not set property 'id' of 'class ...
- 【Oracle】oracle pctfree和pctused详解
oracle pctfree和pctused详解 一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数 ...
- 【Linux】添加硬盘不需要重启服务器
添加硬盘之后,不用重启服务器 执行下面的语句 ls /sys/class/scsi_host 查看下面有多少host 我这里有三个host 分别执行 echo "- - -" &g ...
- 【Linux】用find删除大于30天的文件
1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令:find /opt/soft/log/ -mt ...
- kubernets之pod的标签
一 如何查看pod 的日志 1 通过执行命令查看日志信息 kubectl logs pod_name 二 创建带有标签的pod,一个范例的pod创建yaml文件如下所示 2.1 创建带有 ...
- pandas 写csv 操作
pandas 写csv 操作 def show_history(self): df = pd.DataFrame() df['Time'] = pd.Series(self.time_hist) df ...
- C#使用struct直接转换下位机数据
编写上位机与下位机通信的时候,涉及到协议的转换,比较多会使用到二进制.传统的方法,是将数据整体获取到byte数组中,然后逐字节对数据进行解析.这样操作工作量比较大,对于较长数据段更容易计算位置出错. ...
- 前端基础功能,原生js实现轮播图实例教程
轮播图是前端最基本.最常见的功能,不论web端还是移动端,大平台还是小网站,大多在首页都会放一个轮播图效果.本教程讲解怎么实现一个简单的轮播图效果.学习本教程之前,读者需要具备html和css技能,同 ...
- Django-发上云服务器遇到的问题
1.服务器启动后外网访问显示A server error occurred. Please contact the administrator. 解决方法:原文:https://www.cnblogs ...
- CSSmargin击穿问题(子元素margin-top会影响父元素)
最近写一个H5页面的时候发现了这个被忽视的问题,一时没想到什么原因,搜了半天,记录一下,方便他人踩坑.唉,有些东西不用就忘. 一.问题描述 <div class="container& ...