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 can subtract either the largest 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.

贝茜和约翰在玩一个数字游戏.贝茜需要你帮助她.

游戏一共进行了G(1≤G≤100)场.第i场游戏开始于一个正整数Ni(l≤Ni≤1,000,000).游

戏规则是这样的:双方轮流操作,将当前的数字减去一个数,这个数可以是当前数字的最大数码,也可以是最小的非0数码.比如当前的数是3014,操作者可以减去1变成3013,也可以减去4变成3010.若干次操作之后,这个数字会变成0.这时候不能再操作的一方为输家. 贝茜总是先开始操作.如果贝茜和约翰都足够聪明,执行最好的策略.请你计算最后的赢家.

比如,一场游戏开始于13.贝茜将13减去3变成10.约翰只能将10减去1变成9.贝茜再将9减去9变成0.最后贝茜赢.

输入格式

* Line 1: A single integer: G

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

输出格式

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

输入输出样例

输入 #1

2 

9 

10

输出 #1

YES 

NO

说明/提示

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.

思路

每种状态可以转移出两个新状态。博弈论的结论:

当某种状态的后继状态都是必败状态时,该状态为必胜状态;

当某种状态的后继状态有一种是必胜状态时,该状态为必败状态。

所以先将0标记为必败,1-9标记为必胜(显然),从10-1000000遍历一遍,用f数组存必败或必胜,然后输出就可以了。在求f[i]的时候只会用到f[i-max/min],而max/min必然大于0,所以顺序遍历即可。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1000010;

int q,n;
int f[N];

int minn(int a) {
	int num;
	num=20;
	while(a) {
		if(a%10)
			num=min(num,a%10);
		a/=10;
	}
	return num;
}

int maxx(int a) {
	int num;
	num=-10;
	while(a) {
		if(a%10)
			num=max(num,a%10);
		a/=10;
	}
	return num;
}

int main () {
	memset(f,false,sizeof(f));
	for(int i=1; i<=9; i++)
		f[i]=true;
	for(int i=11; i<=N; i++)
		if(f[i-minn(i)]&&f[i-maxx(i)])
			f[i]=false;
		else
			f[i]=true;
	scanf("%d",&n);
	for(int i=1; i<=n; i++) {
		scanf("%d",&q);
		if(f[q]==false)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}

原文地址:https://www.cnblogs.com/mysh/p/11333427.html

时间: 2024-11-09 02:04:19

P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game的相关文章

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

题意: 给你一个数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 usi

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

XDU1160 - 科协的数字游戏I

Description 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成大于等于的关系,如123,446.现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数. Input 题目有多组测试数据.每组只含2个数字a, b (1 <= a, b <= 2^31). Output 每行给出一个测试数据的答案,即[a, b]之间有多少阶梯数. Sample Input 1 9 1 19 Sample Output 918 数位DP基础题:

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的

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

P1118 [USACO06FEB]数字三角形Backward Digit Su…

P1118 [USACO06FEB]数字三角形Backward Digit Su… 题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They rep

Loj10166 数字游戏2

题目描述 由于科协里最近真的很流行数字游戏,某人又命名了一种取模数,这种数字必须满足各位数字之和 modN 为 000.现在大家又要玩游戏了,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个取模数. 枚举每一位,记录每一次枚举%n的余数,当枚举完时,如果余数是0,就+1,否则+0. #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib>

Loj10164 数字游戏1

题目描述 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 123,446.现在大家决定玩一个游戏,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个不降数. 数位DP的模板,记忆化搜索时枚举从当前状态开始就行.具体看注释 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #inc