SRM710 div1 MagicNim(博弈论)
题目大意:
给出n+1堆石子,前n堆石子的数量是a[i],最后一堆只有1个石子,但是具有魔力
拿走该石子的一方可以选择接下来是进行普通的Nim游戏还是anti-nim游戏
问是先手必胜还是必败
首先拿全是1的情况熟悉一下规则
如果全是1,那么无论有几堆,先手都是必胜的
因为如果有奇数个1,那么Alice直接拿掉魔力石子,然后选择不改变游戏,那么他还是赢的
如果有偶数个1,那么Alice直接拿掉魔力式子,然后选择改变游戏,于是他还是赢的。
然后回忆一下anti-nim的先手必胜条件(这里的SG不考虑多魔法石子的那一堆)
SG为0,且所有石子均为1
SG不为0,且存在一堆石子大于1
所以,如果不全是1,且SG为0的话,Alice是必输的,因为他取魔力石子后,仍然无法改变必输的情况
所以现在情况只有不全是1,且SG不为0
注意到这个时候任何一方如果直接取魔力石子,都是必败的
所以双方应该会保持SG不为0,然后进行对峙
首先考虑所以石子的数量不超过3
那么SG函数的值就只有3个,1,2,3
当SG为1或3的时候,肯定有一种取法使得SG为2
而SG为2的最终情况是2附加一个魔力石子,这种情况是必败的
所以当石子的数量不超过3时,SG=2先手必败,反之必胜
接下来考虑石子的数量超过3,也就是有4和4以上的数
那么SG函数的值可以分成1和超过1的那些情况
如果当前SG值为1,那么只能把它变成超过1的值,然而对手又可以把它变回到1
我们考虑假设只有1个超过3的数,那么这时候SG值肯定是大于3的
直接改变这个数,我们可以使得接下来的局面变成SG=2
也就是说,如果只有1个超过3的数,那么就是先手必胜
那么如果SG值为1,且我们知道存在超过3的数,那么超过3的数的数量必定至少有2个
也就是说,经过不断地对峙,原来SG值为1的话,现在SG值仍然为1
但是经过了很多减少,一定会达到这个局面
即SG值为1,且超过3的数量只有2个
当这2个其中的一个数减到4以下时,就变成了只有1个超过3的数
即SG->1->3以上->2(最终结果)
也就是说SG如果为1,必定会转化成2,那么SG=1就是必败局面,而其他情况是必胜局面
最后结论就是
如果有大于3的数,那么SG=1必败
如果没有,那么SG=2必败
(PS:题解的思路没有太明白,不知道是怎么想到右移1位然后分类的,然后莫名分类就分出来了orz)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <typeinfo>
#include <fstream> using namespace std; class MagicNim {
public:
string findWinner(vector<int> a) {
sort(a.begin(), a.end());
int n = a.size(), sg = ;
for(int i = ; i < n; i++) sg ^= a[i];
if(a[n-] >= ) return (sg == ? "Bob" : "Alice");
else return (sg == ? "Bob" : "Alice");
}
};
SRM710 div1 MagicNim(博弈论)的更多相关文章
- SRM710 div1 ReverseMancala(trick)
题目大意, 给定一个有n个点的环,n不超过10,每个点上有一个权重 起始时权重将会给出,然后有2种操作 第一种操作是,选择一个位置i,获得权重w = a[i],把a[i]变成0,然后接下来在环上顺着走 ...
- IT人生知识分享:博弈论的理性思维
背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...
- [poj2348]Euclid's Game(博弈论+gcd)
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9033 Accepted: 3695 Des ...
- 博弈论揭示了深度学习的未来(译自:Game Theory Reveals the Future of Deep Learning)
Game Theory Reveals the Future of Deep Learning Carlos E. Perez Deep Learning Patterns, Methodology ...
- TYVJ博弈论
一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140 飘飘乎居士拯救MM 题解: 歌德巴赫猜想 #include <cmath> #include < ...
- Codeforces 549C. The Game Of Parity[博弈论]
C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...
- CF#345 (Div1)
论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
随机推荐
- 亚马逊VPS
添加用户: 第一步 注册亚马逊云(已注册直接进入第二步)1.开始前需要准备好:有外币支付功能的信用卡一张(注册需要,不扣钱).Email地址.电话(手机更方便一些)2.访问 https://amazo ...
- linux命令之磁盘和文件系统操作
1. fdisk:磁盘分区命令 语法:fdisk [选项][参数] 命令说明:fdisk是linux系统里常用的一种磁盘管理工具,可以创建和管理系统分区 常用命令选项: -l:列出指定的并退出,没 ...
- struts2的token interceptor
关于struts2的token拦截器的说明 原理:struts2的token interceptor是关于重复提交的拦截器,其实现是:在form表单中加入token标签,如下: <form ac ...
- 初次了解MVC框架模式
MVC框架:即Model.View.Controller即模型.视图.控制器. View层是界面,Model层是业务逻辑,Controller层用来调度View层和Model层,将显示界面和业务逻辑合 ...
- django开发傻瓜教程-3-celery异步处理
Ref: https://www.jianshu.com/p/6f8576a37a3e https://blog.csdn.net/Demo_3/article/details/78119951 ht ...
- 毕业2年 Summary
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/135 看了下去年写毕业一周年总结的时间:2017-6-16,今天 ...
- 数据库 MySQL part2
表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...
- android 怎么判断activity 从哪里启动的
有时候,你想要知道,有一个activity 从哪里启动的.怎么才能知道呢? 1.前提是,androidstadio 你下载了源码.找到你的activityBase的实现类,在startActivity ...
- C++基础语言知识大汇总(不断更新!!!)
经过十天的时间,LITTLESUN做好了前期的工作,今天LITTLESUN就要在新地图里扬帆起航喽!!!(撒花) 简单的整理了一下这次启航准备好的物资.后面的航程中也会不断来补充这个小仓库哦!
- L009文件属性知识详解小节
本堂课分为5部分内容 1.linux下重要目录详解 2.PATH变量路径内容 3.linux系统中文件类型介绍 4.linux系统中文件属性详细介绍 5.linux系统文件属性inode与block知 ...