hdu1536 sg打表

标记数组用bool型防止超时。输入的f[ ]要排序。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 10003
int f[maxn],sg[maxn];
bool vis[maxn];
void getsg(int k)
{
    int i,j;
    memset(sg,0,sizeof(sg));
    for(i=1;i<maxn;i++)
    {
        memset(vis,false,sizeof(vis));
        for(j=0;f[j]<=i&&j<k;j++)
        {
            vis[sg[i-f[j]]]=true;
        }
        for(j=0;j<=maxn;j++)
        {
            if(!vis[j])
            {
                sg[i]=j;
                break;
            }
        }
    }
}

int main()
{
    int k,n,i,j;
    while(scanf("%d",&k)!=EOF)
    {
        if(!k)break;
        for(i=0;i<k;i++)
            scanf("%d",&f[i]);
        sort(f,f+k);
        getsg(k);
        scanf("%d",&n);
        int num=0;
        while(n--)
        {
            int m;
            scanf("%d",&m);
            int ans=0;
            for(j=0;j<m;j++)
            {
                int temp;
                scanf("%d",&temp);
                ans^=sg[temp];
            }
            if(ans==0)
            {
                printf("L");
            }
            else printf("W");
        }
        printf("\n");
    }
}
时间: 2024-09-21 08:40:08

hdu1536 sg打表的相关文章

hdu 2147 kiki&#39;s game(DP(SG)打表找规律)

题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n,m<=2000) 思路: dp[i][j]=0,说明从(i,j)这个点到时左下角先手败.dp[i][j]=1则先手胜. 然后记忆搜.但是记忆搜会超时. 搜完把整张表打出来,发现规律了,,,,然后,,,代码剩几行了. 代码: ///打表观察 /* int f[2005][2005]; int go(in

HDU 3032 (SG打表找规律)

题意: 有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 思路: 因为数的范围比较大,所以最好通过SG打表的结果找出规律在解. sg(4k+1)=4k+1;sg(4k+2)=4k+2;sg(4k+3)=4k+4; sg(4k)=4k-1; 1 2 4 3 5 6 8 7 Sample Input232 2 323 3 Sample OutputAliceBob SG打表找规律

UVA 1482 - Playing With Stones(SG打表规律)

UVA 1482 - Playing With Stones 题目链接 题意:给定n堆石头,每次选一堆取至少一个,不超过一半的石子,最后不能取的输,问是否先手必胜 思路:数值很大,无法直接递推sg函数,打出前30项的sg函数找规律 代码: #include <stdio.h> #include <string.h> int t, n; long long num; long long SG(long long x) { return x % 2 == 0 ? x : SG(x /

hdu 3032 sg打表找规律 *

有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆.alice与bob轮流取,取走最后一个石子的人胜利. 打表代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 const int N=1000010; 7 int sg[N];

HDU 3032 Nim or not Nim?(博弈 SG打表找规律)

传送门 Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1457    Accepted Submission(s): 720 Problem Description Nim is a two-player mathematic game of strategy in which players take

51nod_1714:B君的游戏(博弈 sg打表)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1714 nim游戏的一个变形,需要打出sg函数的表 #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=70000000; int sg[65], maxs; int vis[maxn]; //yu控制递归层数,cur控制所分配最大值,next控

石油大训练 Little Sub and Johann (博弈SG打表找规律)

Little Sub and Johann 题目描述 Little Sub and Johann are good friends and they often play games together. Recently, they like playing with stones.They have n piles of stones initially and they should make one of following movements by turns:1.Erase a pil

Fibonacci again and again(hdu1848+SG打表)

Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6170    Accepted Submission(s): 2574 Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)

S-Nim(hdu1536+SG函数)

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5317    Accepted Submission(s): 2288 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now