【poj2960】 S-Nim

http://poj.org/problem?id=2960 (题目链接)

题意:经典Nim游戏,只是给出了一个集合S,每次只能取S[i]个石子。

Solution 
  g(x)=mex{SG(x-s[1]),SG(x-s[2])……} 
  数据范围很小,可以暴力求SG,顺便记忆化一下。不知道为什么用map就TLE了。。。只好开数组了。

代码:

// poj2960
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<map>
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
    LL x=0,f=1;char ch=getchar();
    while (ch>‘9‘ || ch<‘0‘) {if (ch==‘-‘) f=-1;ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}

const int maxn=10010;
int k,n,m,sg[maxn],s[maxn];

void calsg(int x) {
    if (sg[x]!=-1) return;
    //map<int,bool> mark;
    bool mark[10010];
    memset(mark,0,sizeof(mark));
    int temp;
    for (int i=1;i<=k;i++) {
        temp=x-s[i];
        if (temp>=0) {
            if (sg[temp]==-1) calsg(temp);
            mark[sg[temp]]=1;
        }
    }
    for (int i=0;;i++) if (!mark[i]) {sg[x]=i;return;}
}
int main() {
    while (scanf("%d",&k)!=EOF && k) {
        for (int i=1;i<=k;i++) scanf("%d",&s[i]);
        sg[0]=0;
        for (int i=1;i<=maxn;i++)
            sg[i]=-1;
        scanf("%d",&m);
        while (m--) {
            scanf("%d",&n);
            int ans=0;
            while (n--) {
                int x;scanf("%d",&x);
                if (sg[x]==-1) calsg(x);
                ans^=sg[x];
            }
            if (ans) printf("W");
            else printf("L");
        }
        printf("\n");
    }
    return 0;
}

  

时间: 2024-12-16 14:27:11

【poj2960】 S-Nim的相关文章

【POJ2960】S-Nim SG函数 博弈 裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42653601 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意: 两人轮流从若干堆石子中某堆取k个石子, k∈集合S, 就是每次取的数量被限定成某几个数的意思! 然后跟正常Nim一样谁不能操作就输. 题解: SG函数裸题. SG函数: 首先需要是有向无环图(拓扑图) 首先确定边界状态,SG值为0,然后暴力拓扑得出其它点的SG值. SG值为所有子集的SG值中未出现的最小自

【手动开栈】【dfs序】【树状数组】【Tarjan】bzoj2819 Nim

考虑树状数组区间修改(只对其子树的答案有影响)点查询,每个点记录的是它到根路径上的权值异或和. 答案时query(L)^query(R)^a[lca]. 这种方法在支持区间加法.减法的树上询问的时候可以避免树链剖分. 可能爆栈,考虑手动开栈.(诶诶Tarjan预处理lca的时候怎么没手动开栈?不要在意^_^) 实际上不会爆的. #include<cstdio> #include<stack> #include<algorithm> #include<queue&g

【bzoj2819】Nim

Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有唯一一条路径可到达.然后他不

【HDU3032】【Lasker&#39;s Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42652745 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:n堆石子,每次可以从某堆中拿走若干,也可以把此堆分成两个非空堆,谁无法操作了谁输. 题解:首先我们可以打个SG函数来暴力出解,但是显然这会T. 但是不要害怕,我们打完以后发现了一个貌似对的规律: 对于所有的k >= 0,有 sg( 4k+1 ) = 4k+1: sg( 4k+2 ) = 4k+2: sg(

【BZOJ】4147: [AMPPZ2014]Euclidean Nim

[算法]博弈论+数论 [题意]给定n个石子,两人轮流操作,规则如下: 轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子 : 轮到后手操作时:若石子数<q添加q个石子,否则拿走q的倍数个石子 . 拿走所有石子的人胜利,问先手是否必胜,或输出游戏会永远进行下去 [题解]引用自:BZOJ 4147 AMPPZ2014 Euclidean Nim 博弈论+数论 by popoqqq 施工中--

【BZOJ2819】Nim 树状数组+LCA

[BZOJ2819]Nim Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略的.于是vfleaking决定写一个玩Nim游戏的平台来坑玩家.为了设计漂亮一点的初始局面,vfleaking用以下方式来找灵感:拿出很多石子,把它们聚成一堆一堆的,对每一堆编号1,2,3,4,...n,在堆与堆间连边,没有自环与重边,从任意堆到任意堆都只有

【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基

[BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(又轮到

【模板】nim游戏

题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取.每次只能从一堆里取.最后没石子可取的人就输了.假如甲是先手,且告诉你这n堆石子的数量,他想知道是否存在先手必胜的策略. 输入格式 第一行一个整数T<=10,表示有T组数据 接下来每两行是一组数据,第一行一个整数n,表示有n堆石子,n<=10000; 第二行有n个数,表示每一堆石子的数量 输出格式 共T行,如果对于

【博弈论】HDU 5754 Life Winner Bo

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一开始棋子在(1,1),谁先走到(n,m)谁赢,无法走动算平局D. (n,m<=1000,case<=1000) 题目思路: [博弈论] 这题博弈论.怎样都输为必败,只能走到必败的为必胜. 王:(王可以横竖斜走一格)如果n个m均为奇数先手必败,否则必胜. 从3x3格子看,当n和m均为奇数时先手必败,