• hdu2897找规律


    又是找规律,无语了,说好的博弈呢,搞了半天的sg函数没有一点头绪

    当n%(p+q)==0时,先手win,第一次取q个,以后每次,后手取k个,先手就取p+q-k个,最后,后手必取q个

    当n=(p+q)*k+s(p<s<q)时,先手win,第一次取t(s-p<t<s)个,以后每次,后手取k个,先手就取p+q-k个,最后,后手必取小于p个

    当n=(p+q)*k+s(1<s<=p)时,先手lost,第一次取k个,后手取p+q-k个,最后先手必取小于p个

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cassert>
    #include<iomanip>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pi acos(-1)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-9;
    const int N=1000+10,maxn=111117,inf=11111;
    
    int f[N],sg[N],Hash[N];
    int p,q;
    int getsg(int n)
    {
        memset(Hash,0,sizeof Hash);
        for(int i=1;i<=p-q;i++)
        {
            if(n-f[i]<0)break;
            if(sg[n-f[i]]==-1)
                sg[n-f[i]]=getsg(n-f[i]);
            Hash[sg[n-f[i]]]=1;
        }
        for(int i=0;;i++)
            if(!Hash[i])
               return i;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        while(cin>>n>>p>>q){
       /*     for(int i=1;i<=p-q;i++)
                f[i]=p+i;
            memset(sg,-1,sizeof sg);
            getsg(n);*/
            if(n%(p+q)==0||n%(p+q)>p)cout<<"WIN"<<endl;
            else cout<<"LOST"<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    第二章 逻辑代数及其简化
    小知识:三极管ie==ic+ib
    第二章.2 真值表→表达式的转换
    C# 静态变量及静态函数
    第四章(1):变量静态变量和实例变量
    转义大括号
    能被15整除的最大整数
    动态规划矩阵连乘问题
    [转]三极管的集电结反向偏置电压
    anddroid App, Framework, Sdk编译
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/6962752.html
Copyright © 2020-2023  润新知