高僧斗法—题解

标题:高僧斗法

古时丧葬活动中经常请高僧做法事。仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛。

节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠)。又有若干小和尚随机地“站”在某个台阶上。最高一级台阶必须站人,其它任意。(如图1所示)

两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。两个小和尚也不能站在同一台阶,也不能向低级台阶移动。

两法师轮流发出指令,最后所有小和尚必然会都挤在高段台阶,再也不能向上移动。轮到哪个法师指挥时无法继续移动,则游戏结束,该法师认输。

对于已知的台阶数和小和尚的分布位置,请你计算先发指令的法师该如何决策才能保证胜出。

输入数据为一行用空格分开的N个整数,表示小和尚的位置。台阶序号从1算起,所以最后一个小和尚的位置即是台阶的总数。(N<100, 台阶总数<1000)

输出为一行用空格分开的两个整数: A B, 表示把A位置的小和尚移动到B位置。若有多个解,输出A值较小的解,若无解则输出-1。

例如:

用户输入:

1 5 9

则程序输出:

1 4

再如:

用户输入:

1 5 8 10

则程序输出:

1 3

资源约定:

峰值内存消耗 < 64M

CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型(千万不要混淆c和cpp)。

import java.util.Scanner;

/**
 *
 *  高僧斗法
 *
 *  解题思路: 可以转化为 Nim 游戏的方法。
 *
 *
 *  测试数据:
 *  1 5 8 19 22 34 56 78 100
 *   34 51
 *   56 75
 *
 *
 *    1 2 0 4  0
 *   1 3 6 7 12 13
 *   0 1 2 3
 *
 */

public class Asist
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		String []ss = sc.nextLine().split(" ");
		int a[] = new int [ss.length];
		for (int i = 0; i < a.length; i++) a[i] = Integer.parseInt(ss[i]);
	// 临时数组——和尚之间的格数
		int b[] = new int [a.length];
		int b1 = 0;
		for (int i = 1; i < a.length; i++)
		{
		    b[b1++] = a[i] - a[i-1] - 1;
		}
	// 转化为Nim求解
		int sum = 0;
		for (int i = 0; i <= b1; i+=2)
		{
			sum ^= b[i];
		}
	    if (sum == 0) System.out.println("-1");
	    else
	    {
	    	// 所有和尚的移动,暴力破解
	    	for (int i = 0; i < a.length; i++)
	    	{
	    		for (int j = 1; j <= b[i]; j++)
	    		{
	    			b[i]-=j;
	    			if (i!=0) b[i-1] += j;

	    			sum = b[0];
	    			for (int k = 2; k <= b1; k+=2 )
	    			{
	    			    sum ^= b[k];
	    			}
	    			if (sum == 0)
	    			{
	    				System.out.println(a[i]+ " " + (a[i]+j));
	    				break;
	    			}
	    		// 回溯
	    			b[i] += j;
	    			if (i!=0) b[i-1] -= j;
	    		}
	    	}
	    }
	}
}
时间: 2024-10-12 19:52:01

高僧斗法—题解的相关文章

历届试题 高僧斗法(博弈)

历届试题 高僧斗法 时间限制:1.0s   内存限制:256.0MB 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地上“画”出若干级台阶(表示N级浮屠).又有若干小和尚随机地“站”在某个台阶上.最高一级台阶必须站人,其它任意.(如图1所示) 两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过.两个小和尚也不能站在同一台阶,也不能向低级台阶移动.

高僧斗法

这个,由于,情况特殊,那个最后找第一步怎么移动的时候,要暴力枚举啊-- #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<a

蓝桥杯 历届试题 高僧斗法

历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地上"画"出若干级台阶(表示N级浮屠).又有若干小和尚随机地"站"在某个台阶上.最高一级台阶必须站人,其它任意.(如图1所示) 两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过.两个小和

高僧斗法 类似算法尼姆解法

1 public class 尼姆_nim { 2 3 public static void main(String[] args) { 4 Scanner sc=new Scanner(System.in); 5 int caseNum=sc.nextInt();//输入有几组 6 int[][] data=new int[caseNum][]; 7 for(int i=0;i<caseNum;i++) { 8 int k=sc.nextInt();//每组又有多少数据 9 data[i]=n

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

2014蓝桥杯决赛解题报告

1.猜灯谜 题目: A村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交“请猜谜”三个字所代表的整数即可. 请严格按照格式,通过浏览器提交答案. 注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字. 分析: 请猜谜 * 请猜谜 = 请边赏灯边猜 abc*abc=adefdb 代码: #include<bits/stdc++.h> using namespace

算法-蓝桥杯习题(六)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

算法笔记_203:第四届蓝桥杯软件类决赛真题(C语言B组)

目录 1 猜灯谜 2 连续奇数和 3 空白格式化 4 高僧斗法 5 格子刷油漆 6 农场阳光   前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 猜灯谜 标题:猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交"请猜谜"三个字所代表的整数即可. 请严格按照格式,通过浏览器提交答案. 注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字. 9

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种