hdu 4315 Climbing the Hill 博弈问题,可转化为nim游戏问题,多校联合赛(二)第六题
博弈问题,先考虑如果总数n为偶数(k!=1),当n个点全两两挨在一起时,谁先走谁输(自己模拟吧)
当总数n为奇数时(k!=1),先吧第一个点走道终点,然后就是偶数的情况了,然后考虑怎么将他们两两挨在一起(注意不用所有点都挨在一起)
这是就是当n为偶(k!=1)计算a[i+1]与a[i]的距离,for(i+=2),这样我们就将它化成几点nim游戏问题,将a[i+1]与a[i]的距离左为每堆石子的个数
当n为奇数,就是a【1】自己当作一个堆,然后还是将a[i+1]与a[i]的距离左为每堆石子的个数,轮到谁没有石子取了,谁就输啦!当然注意特殊情况就是当n为奇数的时候,k如果为2,前面我们说当n为奇数是直接将第一个直接走到终点,但因为第二哥是k了,所以第一个a[i]不能走道终点,只能走道里终点最近的位置也就是只能走a[i]-1步,所以就是将a[i]-1当作一个堆
再说一下什么是nim游戏
通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。
为什么可以a1^a2^...^an=0 就判断先取的一定赢呢,首先是如果堆内的石子数量成对相等,这个应该都明白,就是2,2的情况或者4,4,9,9,这样,谁先取谁输,但如果是三组的呢,怎么办,用a1^a2^...^an=0,啊!!简洁的说就是将所有堆数全都分解成二进制堆,譬如9,5,12,谁先取谁输,为什么,就是9的二进制1001分成8和1,5的二进制0101分成4和1,12的二进制1100分成8和4,然后9,5,12就变成1,1,4,4,8,8了这不就是成对了么,就业是为什么a1^a2^...^an=0就可一判断谁先走谁输了
以上都是自己的一些理解,如有错误请指正哈!!!!(*^__^*) 嘻嘻……
代码如下
#include<iostream>
#include<cstdio>
using namespace std;
int a[1005],ans;
int n,k;
void move(){int i;if(n%2==0){for(i=1;i<=n;i+=2){ans^=(a[i+1]-a[i]-1);}}else{ans^=a[1];for(i=2;i<=n;i+=2){ans^=(a[i+1]-a[i]-1);}}}
int main(){while(~scanf("%d%d",&n,&k)){for(int i=1;i<=n;i++)scanf("%d",&a[i]);ans=0;if(k==1) {printf("Alice\n");continue;}if(k==2 && n%2==1){a[1]--;move();}else move();
// cout<<ans<<endl;if(ans==0) printf("Bob\n");else printf("Alice\n");}}
hdu 4315 Climbing the Hill 博弈问题,可转化为nim游戏问题,多校联合赛(二)第六题相关推荐
- HDU多校联合赛(1007 Magical Forest)模拟题
题目: Problem Description There is a forest can be seen as N * M grid. In this forest, there is some m ...
- hdu 1907 Jone 尼姆博弈
题目:点击打开链接 John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- ACM-尼姆博弈之取(m堆)石子游戏——hdu2176
取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- #1163 : 博弈游戏·Nim游戏(数学博弈)
#1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob. Alice与Bob总是在进行各种各样 ...
- hihoCoder#: 博弈游戏·Nim游戏
[题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,A ...
- 博弈游戏·Nim游戏·二
题目1 : 博弈游戏·Nim游戏·二 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 Alice和Bob这一次准备玩一个关于硬币的游戏: N枚硬币排成一列,有的正面 ...
- 【小组专题二:博弈论入门综述(1)】NP状态 | SG函数 | 巴什博奕、威佐夫博弈、斐波那契博弈、Nim游戏、SJ定理
博弈论综述[1] 前言 博弈与博弈论 博弈树 NP状态 SG函数(Sprague-Grundy) Sprague-Grundy Theorem 巴什博奕 Bash Game 威佐夫博弈 扩展威佐夫博弈 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 蓝桥杯第七届省赛java组大题解析(“取球博弈”??难度,“压缩变换”三星难度)
第六题 题目: 方格填数 如下的10个格子 +--+--+--+ | 0| 1| 2| +--+--+--+--+ | 3| 4| 5| 6| +--+--+--+--+ | 7| 8| ...
- python博弈树_简单博弈树算法(nim游戏)
简单博弈树算法(nim游戏)的python实现. import random import treelib import sys tagid=0 def genId(): global tagid t ...
最新文章
- SQLSERVER DISTINCT的反例
- 洛谷1090 合并果子
- shell变量/环境变量和set/env/export用法_转
- C语言变量定义和赋值
- 大连理工18秋计算机应用基础,大连理工大学网络教育本科计算机应用基础入学考试模拟题...
- 十进制小数化为二进制小数的方法是什么_十进制转成二进制的两种方式
- python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI
- 关于WinCE6.0补丁包的一点说明
- 使用SQL Server Management Studio 创建作业备份数据库
- php-fpm启动条件,php-fpm的启动、重启
- C语言博客作业---嵌套循环
- Bug:No mapping for GET /onepill//swagger-ui.html
- DBUtil使用步骤
- Web前端必备:JavaScript基础知识梳理
- linux下为php添加GD库(重新编译php)
- 嵌入式设备交叉编译perf性能分析工具
- Git的基本使用(用户初始化配置、新建代码库、把文件提交到缓存区、把文件提交到本地仓库等)
- 华为一级产品线介绍(部分)
- Mac 使用Charles后,退出Charles后,不能浏览网页,提示:未连接到互联网代理服务器出现问题,或者地址有误。
- 计算机科学 在职双证,计算机在职研究生有双证吗