我是靠谱客的博主 温暖高跟鞋,最近开发中收集的这篇文章主要介绍bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏 Nim游戏+SG函数题意分析代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意

有n堆石子,第i堆石子有a[i]块石头。每次只能在一堆石子中取b[j]个{1<=j<=m}
问先取者是否有必胜策略,有则输出第一次在第几堆石子取多少个。
n,m<=10,a[i]<=1000

分析

第一次接触SG函数,感觉是个蛮神奇的东西。

转载一点相关的文章:
首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数。例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Grundy函数g如下:g(x)=mex{ g(y) | y是x的后继 },这里的g(x)即sg[x]
例如:取石子问题,有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;
以此类推…..
x 0 1 2 3 4 5 6 7 8….
sg[x] 0 1 0 1 2 3 2 0 1….

知道SG函数之后这题就变得很简单了。
首先最经典的Nim游戏是若a[1]^a[2]^…^a[n]!=0则先手有必胜策略,推广到这题,若sg[a[1]]^sg[a[2]]^…^sg[a[n]]!=0则先手有必胜策略,证明同普通的Nim游戏类似,在此略过。
最后枚举一下即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 15
using namespace std;

int n,m,a[N],f[N],sg[1005],hash[1005];

void getsg(int n,int m)
{
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
            if (i-f[j]>=0) hash[sg[i-f[j]]]=i;
        for (int j=0;j<=i;j++)
            if (hash[j]!=i)
            {
                sg[i]=j;
                break;
            }
    }
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
        scanf("%d",&f[i]);
    getsg(1000,m);
    int sum=0;
    for (int i=1;i<=n;i++)
        sum^=sg[a[i]];
    if (!sum)
    {
        printf("NO");
        return 0;
    }
    printf("YESn");
    for (int i=1;i<=n;i++)
    {
        int tmp=sg[a[i]]^sum;
        for (int j=1;j<=m;j++)
            if (a[i]-f[j]>=0)
                if ((tmp^sg[a[i]-f[j]])==0)
                {
                    printf("%d %d",i,f[j]);
                    return 0;
                }
    }
    return 0;
}

最后

以上就是温暖高跟鞋为你收集整理的bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏 Nim游戏+SG函数题意分析代码的全部内容,希望文章能够帮你解决bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏 Nim游戏+SG函数题意分析代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部