USACO 2009 Open Silver 3.Cow Digit Game简单博弈论

原创 2016年08月28日 16:01:36
Description

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 can subtract either the larges digit or the smallest non-zero digit from the current number to obtain a new number. For example, from 3014 we may subtract either 1 or 4 to obtain either 3013 or 3010, respectively. The game continues until the number becomes 0, at which point the last player to have taken a turn is the winner.

Bessie and FJ play G (1 <= G <= 100) games. Determine, for each game, whether Bessie or FJ will win, assuming that both play perfectly (that is, on each turn, if the current player has a move that will guarantee his or her win, he or she will take it).

Consider a sample game where N_i = 13. Bessie goes first and takes 3, leaving 10. FJ is forced to take 1, leaving 9. Bessie takes the remainder and wins the game.

Input
* Line 1: A single integer: G

* Lines 2..G+1: Line i+1 contains the single integer: N_i

Output
* Lines 1..G: Line i contains "YES" if Bessie can win game i, and "NO" otherwise.

Sample Input
2
9
10
Sample Output
YES
NO

OUTPUT DETAILS:

For the first game, Bessie simply takes the number 9 and wins. For the second game, Bessie must take 1 (since she cannot take 0), and then FJ can win by taking 9.

题意:对于一个初始的数n,每次可以减去这个数的数位中最大的那一位,或是最小的非零的那一位,如3014中最大的是4,最小非零的是1,可以得到3014-1=3013或3014-4=3010,两个人轮流操作,减到到0的人获胜。

最近迷上了这些简单的博弈论了呢~

显然,当轮到一个人时,n已经为0,则此时就是一个必败态,令必败态的sg值为0,必胜态的sg值为1,那么我们就可以从小到大递推了。

设当前数i中最大的一位是maxi,最小的非零位是mini,那么若i-maxi和i-mini都对应一个必胜态,那么i就是一个必败态;若i-maxi和i-mini中有一个是必败态,那么i就是一个必胜态。

至于找最大位和最小非零位,鉴于数据范围不是太变态,暴力拆分就可以了。

代码:

#include<stdio.h>
int sg[1000010],num[10],len;
int maxi,mini;
int main()
{
    sg[0]=0;
    int i,t,n;
    len=0;
    for(i=1;i<=1000000;i++)
    {
        t=i;
        maxi=0;
        mini=10;
        while(t)
        {
            if(t%10>maxi)
            maxi=t%10;
            if(t%10>0&&t%10<mini)
            mini=t%10;
            t/=10;
        }
        sg[i]=(sg[i-maxi]&sg[i-mini])^1;
    }
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&t);
        if(sg[t])
        printf("YES\n");
        else
        printf("NO\n");
    }
    return 0;
}
 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

bzoj 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(SG函数)

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 181  Solv...

bzoj 3403: [Usaco2009 Open]Cow Line 直线上的牛

3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 206  Solved: ...

POJ - 3045/USACO - Nov05 Silver Cow Acrobats 牛的杂技 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 3

【问题描述】 FJ养了N头牛,他们按照1到N依次编上了号。FJ所不知道的是,他的所有牛的梦想是从农场逃走,去参加马戏团的演出。可奶牛门很快发现他们那么笨拙的蹄子根本无法在钢丝或晃动的秋千上站稳(他们...

JZOJ2133.2017.05.20【usaco2017_Mar Bronze & Silver】C组T1The Lost Cow

题目描述 Farmer John has lost his prize cow Bessie, and he needs to find her! Fortunately, there i...

【洛谷】1821 [USACO07FEB]银牛派对Silver Cow Party 最短路径

题目传送门 日常水一波,就是对正向图跑一遍SPFA,然后建一张反向图,也就是求其他所有的节点到源点的距离,然后再跑一遍SPFA。 最后输出两次距离和的最大值就行了。 附上AC代码: #include ...
  • lyfsb
  • lyfsb
  • 2017年05月15日 19:31
  • 94

USACO 2009 Dec Silver 2.Music Notes

题目大意就是要区间进行分段,然后进行查询。 对于60%的数据来说,只需要进行桶排即可每次只要读入后,对 该区间进行维护即可。时间和空间都比较充裕 对于100%的数据,我们需要对这个算法进行优化。...

USACO2014 Open Silver Dueling GPSs

USACO 2014 Open Silver Dueling GPSs

USACO2014Open Silver 奶牛的叫唤2.0

Problem 3: Odometer [Brian Dean, 2014] Farmer John’s cows are on a road trip! The odometer on their...

poj 3279 Filptile (USACO 2007 Open Silver)

题意: n*m块区域,每一块有正反两面,两面分别是白色和黑色。 翻转一块区域的同时, 与其相邻的四块区域也会同时被反转  问最少需要翻转的次数 ,使所有的区域都变成白色 输出其翻转方案  思路...

USACO2011Open Silver Running Laps题解

//请忽略我把牛看作羊.... 由题意,我们可以得到 t*vi-t*vj=kC.那么i,j相遇的次数就是最大的k(整数).为了得到最大的k就要使t最大,而tmax=L*C/vmax. 那么 把式子...
  • LIN452
  • LIN452
  • 2016年06月28日 17:07
  • 295
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:USACO 2009 Open Silver 3.Cow Digit Game简单博弈论
举报原因:
原因补充:

(最多只允许输入30个字)