每天一道博弈论之“牛的数字游戏”

题意:

给你一个数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\n") ;
         else printf("NO\n") ;
    }
    return 0 ;
}

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

原文地址:https://www.cnblogs.com/zub23333/p/8516473.html

时间: 2024-11-09 00:54:01

每天一道博弈论之“牛的数字游戏”的相关文章

P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

题目描述 Bessie is playing a number game against Farmer John, and she wants you to help her achieve victory. Game i starts with an integer N_i (1 <= N_i <= 1,000,000). Bessie goes first, and then the two players alternate turns. On each turn, a player c

1861 奶牛的数字游戏 2006年USACO

codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N是奇数,那么奶牛就会把它乘以3后再加1.如果N是偶数,那么这个数就会被除以2.数字每变动一次,这头奶牛就得到1分.当N的

第一个c语言实现的猜数字游戏

#include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <stdio.h> #include <Windows.h> #include <stdlib.h> #include <time.h> void output() { printf("*********************  欢迎玩猜数字游戏   ************

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 48[Submit][Status][Discuss] Description 贝茜和约翰在玩一个数字游戏.贝茜需要你帮助她. 游戏一共进行了G(1≤G≤100)场.第i场游戏开始于一个正整数Ni(l≤Ni≤1,000,000).游 戏规则是这样的:双方轮流操作,将当前的数字减去一个数,这个数可

[BZOJ1666][Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏

1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 849  Solved: 746 [Submit][Status][Discuss] Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N

python3.3使用tkinter实现猜数字游戏代码

发布时间:2014-06-18   编辑:www.jbxue.com 原文地址:http://www.jbxue.com/article/python/22152.html python3.3使用tkinter开发猜数字游戏的例子,python3.3中tkinter的使用方法. 本节脚本小编分享一例ython3.3中tkinter开发猜数字小游戏的代码. 例子,python3.3中tkinter实例. 复制代码代码示例: # -*- coding: utf-8 -*-import tkinter

Vijos P1218 数字游戏

描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 格式 输入格式 输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9).以下n行每行有个整数,其绝对值不大于10^410?4??,按顺序给出圈中的数字,首尾相接. 输出

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

BZOJ2900 好玩的数字游戏

好玩的数字游戏 TK在虐题的同时,也喜欢玩游戏.现在,有这样的一个游戏,规则是这样的:先随机给出一个数字N,然后你在操场上把1到N的所有数字写成一排,就像这样:123456789101112131415-.接着你在每个数字前面添上加减号,每逢排在奇数位上的数字,就写上加号:每逢排在偶数位上的数字,就写上减号.恩-最后你得到一个超级长的式子.并且可以算出这个式子的结果.TK觉得这个游戏很有意思,于是他没日没夜地玩啊玩啊玩啊-或许你觉得这个游戏没有意思-恩-但是,如果你是TK,对于给定的N,你能够算