CF Gym 102059I Game on Plane(sg函数)

链接:https://codeforces.com/gym/102059/problem/I

题意:给定N个点,围成一个圈,每次玩家选择两个点连线,不得与之前连的线相交。 如果玩家连线形成了一个多边形或者没有选的点,输。

题解:连一条边会划分成两个圈(子问题),跑sg函数

#include <bits/stdc++.h>
using namespace std;

const int maxn=5005;
int sg[maxn], vis[maxn];

void calsg()
{
    sg[0]=0; sg[1]=0; sg[2]=1;
    for(int i=3; i<maxn; i++)
    {
        memset(vis, 0, sizeof(vis));
        for(int j=0; j<=i-2; j++)
            vis[sg[j]^sg[i-j-2]]=1;
        for(int j=0; ; j++)
            if(!vis[j]){
                sg[i]=j; break;
            }
    }
}

int main()
{
    calsg();
    int T;
    for(cin>>T; T--; )
    {
        int n; cin>>n;
        printf(sg[n]?"First\n":"Second\n");
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Yokel062/p/11689263.html