zoukankan      html  css  js  c++  java
  • 每天一道博弈论之“牛的数字游戏”

      题意:

        给你一个数n(n<=1e6),玩家可以进行的操作为减去该数最大数码或最小非零数码。即数2014可以减去1变成2013或减去4变成2010。将数变成0的一方赢。

      题解:

        直接求出1-1e6的SG函数值即可。复杂度O(n*lgn)(这里的log以10为底)。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    #define RI register int
    using namespace std;
    const int INF = 0x7ffffff ;
    const int N = 1e6 + 10 ;
    
    inline int read() {
        int k = 0 , f = 1 ; char c = getchar() ;
        for( ; !isdigit(c) ; c = getchar())
          if(c == '-') f = -1 ;
        for( ; isdigit(c) ; c = getchar())
          k = k*10 + c-'0' ;
        return k*f ;
    }
    
    int sg[N] ;
    
    int ser(int x) {
        if(sg[x]) return sg[x] ;
        bool v[100] = {0} ;
        int ii = x, y, minn = INF, maxx = -INF ;
        while(ii) {
            y = ii%10 ; ii /= 10 ;
            if(y) minn = minn < y ? minn : y ;
            maxx = maxx > y ? maxx : y ;
        }
        v[sg[x-minn]] = 1 ;
        v[sg[x-maxx]] = 1 ;
        for(int i=0;;i++)
          if(!v[i]) {
              sg[x] = i ; return i ;
          }
    }
    
    int main() {
        int t = read() ;
        sg[0] = 0 ;
        for(int i=1;i<=1000000;i++) sg[i] = ser(i) ;
        while(t--) {
            int x = read() ;
             if(sg[x]) printf("YES
    ") ;
             else printf("NO
    ") ;
        }
        return 0 ;
    }
    View Code

      

      错误原因:一开始没有看到只能减去最大最小数码T_T

  • 相关阅读:
    3-为什么很多 对 1e9+7(100000007)取模
    6-关于#include<bits/stdc++.h>
    7-n!的位数(斯特灵公式)
    5-math中函数汇总
    6-找数的倍数
    6-Collision-hdu5114(小球碰撞)
    5-青蛙的约会(ex_gcd)
    4-圆数Round Numbers(数位dp)
    4-memset函数总结
    一种Furture模式处理请求中循环独立的任务的方法
  • 原文地址:https://www.cnblogs.com/zub23333/p/8516473.html
Copyright © 2011-2022 走看看