zoukankan      html  css  js  c++  java
  • hdu 1536(SG函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536

    题意:首先输入K 表示一个集合的大小 之后输入集合 表示对于这对石子只能去这个集合中的元素的个数
    之后输入  一个m 表示接下来对于这个集合要进行m次询问
    之后m行 每行输入一个n 表示有n个堆 每堆有n1个石子 问这一行所表示的状态是赢还是输 如果赢输入W否则L

    SG函数百度百科的定义

    根据这个定义,我们把所有石子拆成n堆,然后把每个单独看成一个游戏.

    定义有向图游戏的和(Sum of Graph Games):设G1G2、……、Gnn个有向图游戏,定义游戏GG1G2、……、Gn的和(Sum),游戏G的移动规则是:任选一个子游戏Gi 并移动上面的棋子。Sprague-GrundyTheorem就是:g(G)=g(G1)^g(G2)^^g(Gn)。也就是说,游戏的和的SG函数值是它的所有子游戏的SG函数值的异或

    所以这个题的话我们算出所有子"游戏的和",然后判断,如果异或值不为0,则为Win,否则是Lose

    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <map>
    using namespace std;
    const int N = 10005;
    int sg[N],a[105];
    bool Hash[N];
    void sg_solve(int *s,int t)   ///N求解范围 S[]数组是可以每次取的值,t是s的长度。
    {
        int i,j;
        memset(sg,0,sizeof(sg));
        for(i=1; i<N; i++)
        {
            memset(Hash,0,sizeof(Hash));
            for(j=0; j<t; j++)
                if(i - s[j] >= 0)
                    Hash[sg[i-s[j]]] = 1;
            for(j=0; j<N; j++)
                if(!Hash[j])
                    break;
            sg[i] = j;
        }
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF,n){
            for(int i=0;i<n;i++){
                scanf("%d",&a[i]);
            }
            sort(a,a+n);
            sg_solve(a,n);
            int m;
            scanf("%d",&m);
            while(m--){
                int num,sum=0;
                scanf("%d",&num);
                for(int i=1;i<=num;i++){
                    int v;
                    scanf("%d",&v);
                    sum^=sg[v];
                }
                if(sum) printf("W");
                else printf("L");
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    [leetcode] Combinations
    [leetcode] Search for a Range
    [leetcode] Combination Sum II
    [leetcode] Combination Sum
    [leetcode] Reverse Bits
    [leetcode] Number of 1 Bits
    [leetcode] Longest Substring Without Repeating Characters
    [leetcode] Reverse Words in a String
    [leetcode] Rotate Array
    习题8-3 数组循环右移
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5768741.html
Copyright © 2011-2022 走看看