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>& ...
随机推荐
- 解决每次运行Xcode,都需要输入密码的问题
新买的Mac,在安装了 Xcode 7.1的时候,不知道是配置信息哪里手残了一下,导致每次运行Xcode模拟器 后 都需要输入一次密码. 为此在网上也是查阅了不少的资料,当时 所谓的 XCode--- ...
- Laravel 5.5搭建(lunix-ubuntu)
基本配置 PHP >= 7.0.0 PHP OpenSSL 扩展 PHP PDO 扩展 PHP Tokenizer 扩展 PHP XML 扩展 1:nginx sudo apt-get upda ...
- js onsubmit和return false的关系
一直以来,我都是以为onsubmit=“return false”就不会进行提交,但经过项目之后才知道return false只是避免了之后的跳转,但onsubmit已经是正在进行了,故onsubmi ...
- sqlite3 简单实用方法
打开数据库:sqlite3.exe test.db 显示所有表: .tables 退出 sqlite3:.quit 还有个问题,已经打开一个数据库文件了. 不知道如何在不退出命令行的情况下,更换另一个 ...
- python应用:爬虫实例(静态网页)
爬取起点中文网某本小说实例: # -*-coding:utf8-*- import requests import urllib import urllib2 from bs4 import Beau ...
- Python正则反向引用
str2 ="2018-10-29"c =re.sub(r"(\d{4})-(\d{2})-(\d{2})","\g<1>/\g<2 ...
- LINUX系统配置相关
修改系统引导文件 grub.cfg的文件位置 /boot/grub/grub.cfg set default="4" 默认windows是在第四个选项 set timeout ...
- 【算法】 string 转 int
[算法] string 转 int 遇到的一道面试题, 当时只写了个思路, 现给出具体实现 ,算是一种比较笨的实现方式 public class StringToInt { /// <summa ...
- 使用Visual Studio 2017构建.Net Core的Docker镜像
1 Docker 镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...
- hdu1505City Game(动态规划)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...