Nim博弈

忽然发现博弈论是个很好玩的东西哎

之前假期学长讲课的时候就发现这种必胜的战略可以用来坑人做题

这两天终于做了第一道博弈论的题,写篇博客纪念一下

灵感来源:洛谷P1247

Pre-scene

众所周知,李明和Jenny都喜欢Danny,为了争夺Danny的所有权,他们决定玩一个游戏。规则是这样的:

有k堆扑克牌(不成套),两人轮流从某一堆中拿出x张牌,不能不拿,也不能跨堆拿牌,拿走最后一张(堆)牌的一方获胜。

命运当然是公平的,李明来向你请教有没有必胜的方法,你聪明的,能告诉他么


 

0X10  知识

先来了解一下,什么是Nim博弈


 

通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

                                                                                                                                ——百度百科 


 

了解Nim游戏之后,我们会发现这是一个经典的ICG游戏(不要问我什么是ICG因为我百度百科也不知道)

显然游戏有两种局面,先手必败和先手必胜,我们分别定义他们为P-position和N-position两种,其中P代表Previous,N代表Next,那么我们可以得出,从N-position转移而来的一定是P-position,反之也成立。

0X20  简单的证明

我们先来手玩一组小数据,一共有2堆石子,每一堆都有3个,你是先手的话,会怎么拿?由规则我们知道,玩家的目标是拿走最后一个石子,所以先手的你一定不会把某一堆全部拿走,因为如果这样,后手将会拿走另一堆,先手必败;但是如果你先拿1个,后手会跟着你从另一堆也拿一个,你拿2个,后手仍可以做和你一样的操作,先手必败。至此我们发现,(3,3)是一个P-position的局面。

推论:1.当a1^a2^a3^……a^n=0时,为P-position,即先手必败。

         2.当a1^a2^a3^……a^n!=0时,一定存在某个移动,使得局面变成一个P-position,即此局面为N-position。

0X30  实现

直接异或运算即可,代码过于简单就不放了。

0X40  题解

传送门

了解了上述知识后,这道题几乎就是一个裸的板子了,就是加了一个输出怎么取和取完的状态而已,这也很好实现。

0X41  怎么取

由于我们发现异或和不等于0,我们就要考虑怎么取使得其等于0了。

设k=a1^a2^a3^……a^n,因为k!=0,而显然k^k=0,所以要使a1^a2^a3^……a(n-1)^an^k=0,只需要把其中一个ai变成ai^k即可,又因必须要取,可得ai^k<ai

0X42  取完的状态

直接更改即可

0X43  代码

 1 //
 2 //  main.cpp
 3 //  Luogu
 4 //
 5 //  Created by gengyf on 2019/5/16.
 6 //  Copyright © 2019 yifan Geng. All rights reserved.
 7 //
 8 
 9 #include <cstdio>
10 int n;
11 int a[500005];
12 int main(){
13     scanf("%d",&n);
14     int check=0;
15     for(int i=1; i<=n; i++){
16         scanf("%d",&a[i]);
17         check^=a[i];
18     }
19     if(!check){
20         printf("lose\n");
21         return 0;
22     }
23     for(int i=1; i<=n; i++){
24         if((check^a[i])<a[i]){
25             printf("%d %d\n",a[i]-(check^a[i]),i);
26             for(int j=1; j<=n; j++)
27                 if(j!=i)
28                     printf("%d ",a[j]);
29                 else    printf("%d ",check^a[i]);
30             break;
31         }
32     }
33     return 0;
34 }

 

转载于:https://www.cnblogs.com/gengyf/p/10878126.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java调用怎么调用方法区_Java中的方法调用有多昂贵

java调用怎么调用方法区我们都去过那儿。 在查看设计不良的代码的同时&#xff0c;听听作者对人们永远不应该牺牲性能而不是设计的解释。 而且&#xff0c;您不能说服作者摆脱其500行方法&#xff0c;因为链接方法调用会破坏性能。 好吧&#xff0c;这可能在1996年左右是正确的…

python中的np array函数_numpy中的np.ascontiguousarray()函数

"Return a contiguous array (ndim > 1) in memory (C order)."用途ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组&#xff0c;使得运行速度更快。C order vs Fortran orderC order 指的是行优先的顺序(Row-major Order)&#xff0c;…

OpenCV版本

#include <opencv2/opencv.hpp>using namespace cv;void main(){/*printf("\t当前使用的opencv版本为 OpenCV"CV_VERSION);getchar();*/std::cout << "\t当前使用的opencv版本为 OpenCV" << CV_VERSION << std::endl;system(&quo…

使用jstat的JVM统计信息

过去&#xff0c;我已经写过关于Oracle和/或OpenJDK Java开发工具包&#xff08;JDK&#xff09;随附的几个命令行工具的信息&#xff0c;但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机&#xff08;JVM&#xff09;统计信息”…

每天一点点之 taro 框架开发 - taro路由及传参

1.路由 taro的路由是自带的&#xff0c;不需要我们额外配置&#xff0c;只需要我们在app.js下config中配置pages即可 class App extends Component {config {pages: [pages/test/test,pages/index/index],} } 2.taro通过api实现跳转&#xff0c;替换 官网地址&#xff1a;taro…

调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

微信小程序开发的过程一定会遇到各种问题&#xff0c;最让人棘手的就是支付问题&#xff0c;因为没有支付做商城类似的小程序就没有办法完成最关键的一步。那么支付失败到底什么原因呢&#xff1f;一下子收集了几个错误类似&#xff0c;希望对你有帮助&#xff1a;No.1{err_cod…

Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:

我的理解&#xff0c;我首先把这几个货分为两大类&#xff1b;第一类包括win32控制台应用程序&#xff0c;第二类就是剩下那俩货。而剩下那俩货又有一个包含关系&#xff0c;即win32项目包含mfc。&#xff08;我个人是这个区分的。&#xff09; 一、 区别: &#xff08;1&…

二分图匹配【模板】

传送门&#xff1a; #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define ll long long #define re register const int N1005; inline void read(int &a) {a0;int d1;char ch;while(chgetchar(),ch>9||ch<0)if(…

c++两个数组对比去掉重复的元素_30 数组案例

数组案例案例一&#xff1a;筛选指定数组元素要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后&#xff0c;形成一个不包含0的新数组。var arr [2,0,6,1,77,0,52,0,25,7];var newArr [];for(var i0; i<arr.length; i){if(arr[i]!0){newArr[newArr.length]arr[i…

排序并记录排序前的索引(类似matlab sort函数)

这里用到vector比较方便。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct num_label { int num; int label; }; //自定义“大于” bool comp(const num_label &a, const num_label &b) { return a.n…

selenium实现登录百度(自动识别简单验证码)

需要做的工作 0、工程结构 1、代码&#xff1a; ①baidu_login.py 1 import re2 import os3 import sys4 import time5 import random6 from selenium import webdriver7 from PIL import Image, ImageEnhance8 import pytesseract9 from func import base642str, str2base6410…

为什么猫王不应该访问Java

最近&#xff0c;我参与了一个关于Java的Optional类型系统的漫长的Twitter讨论 &#xff0c;该系统区分可空类型和非可空类型以及Elvis运算符 &#xff0c;该运算符允许选择空值安全的成员。 后者被认为是简洁的null处理的杀手级功能&#xff0c;对此我强烈不同意。 我对此的看…

python a and b_python-尽管Numpy建议a.b,为什么a.dot(b)比a @ b更...

根据question的答案,也根据numpy的答案,与a.dot(b)相比,二维数组的矩阵乘法最好通过a b或numpy.matmul(a,b)完成.If both a and b are 2-D arrays, it is matrix multiplication, but usingmatmul or a b is preferred.我做了以下基准测试,发现相反的结果.问题&#xff1a;我的…

Mysql高可用集群-解决MMM单点故障

目录 一.理论概述组件介绍三.部署四.测试五.总结preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Master replication Manager for MySQL) 是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双…

vector元素的读取

1通过下标&#xff1a; int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (int i 0; i < b.size() - 1; i) cout << b[i] << " "; 2通过迭代器 int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (vector<int>:…

vector 中的元素去重

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { cout << "********************一维向量*************************" << endl; vector<int> a; for (int i 0; i < 6; i) …

tcp的3次握手4次挥手

转载于:https://www.cnblogs.com/georgexu/p/10909808.html

python 如何定义字典_python dict如何定义

1.字典的定义字典的格式&#xff1a;字典名 {key1:value1, key2:value2,...}字典是无序的&#xff0c;是可变的数据类型字典的key不能是可变的数据类型(列表 字典)字典的key是不能重复的&#xff0c;但value可以例&#xff1a;my_dict {"name": "小明", …

MS SQL JSON类型type

在MS SQL Server 2016&#xff0c;已经支持JSON处理。 执行下面代码&#xff0c;将获取ms sql server对象类型以及其说明: IF OBJECT_ID(tempdb.dbo.#json_type) IS NOT NULL DROP TABLE #json_typeCREATE TABLE #json_type ( [type] TINYINT,[data_type] NVARCHAR(30) ) IN…

Eigen(8)实例最小二乘法

用Eigen库解Axb线性方程&#xff0c;使用最小二乘法 #include <iostream>#include <Eigen/Dense>using namespace std;using namespace Eigen;int main(){//对方程AxbMatrixXf A MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n"…