石头剪刀布

Description

  小明和小头遇到了矛盾,他们决定用男人的方式解决战斗——石头剪刀布。但是小菜觉得石头剪刀布已经过时了,于是他发明了另一个更男人的游戏。小菜给出一个自然数n,小明和小头轮流操作,每次操作可以把n减去n所拥有的数字中的最大值或者最小值(不包括0),不能操作者输(即当n=0时)。
  小菜怕他们不懂,于是给了一个例子n=1024,则最大值=4,最小值=1。假如小明先操作,那么他可以留给小头1023或者1020。
  小明和小头觉得这个游戏很好玩,于是打算多玩几局。每次由小明先操作,如果两人都是用最佳策略,请问谁会赢?

Input

  第一行只有一个整数t,表示玩t轮游戏
  接下来t行,每行一个自然数n,表示初始时小菜给出的自然数。

Output

  共t行,如果小明赢了第i轮游戏则在第i行输出“YES” 否则输出“NO”

Sample Input

2
9
10

Sample Output

YES
NO

Data Constraint

Hint

【数据规模】
  40%的数据n≤50
  100%的数据t≤100,n≤1000000
.
.
.
.
.
.
.

分析

显然我们发现这个输赢是奇偶分配的,所以可以转移动态 fi=!fj
那么j是什么呢? 就是i-i中最大值和i-i中最小值,那么设这两为j,k得 fi=!fj∨!fk
那么我们预处理1~10^6的所有值即可
.
.
.
.
.
.
.

程序:
#include<cstdio>
#include<iostream>
using namespace std; 
int main()
{
    bool f[1000001];
    int t,n; 
    cin>>t; 
    for (int i=1;i<=1000000;i++) 
    {
        int y=i,maxx=0,minn=2147483647;
        while (y>0)
        {
            if (y%10)
            {
                maxx=max(maxx,y%10); 
                minn=min(minn,y%10);
            } 
            y/=10;
        }
        f[i]=!f[i-maxx]||!f[i-minn]; 
    }
   for (int i=1;i<=t;i++)
   {
        cin>>n;
        if (f[n]) cout<<"YES"<<endl; else cout<<"NO"<<endl;
   }
   return 0;
}
posted @ 2018-04-07 11:11  银叶草  阅读(199)  评论(0编辑  收藏  举报
Live2D