蓝桥杯2015Java_A组题解

蓝桥杯2015Java_A组

1. 熊怪吃核桃

标题: 熊怪吃核桃

森林里有一只熊怪,很爱吃核桃。不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份。
 如果不能等分,熊怪就会扔掉一个核桃再分。
 第二天再继续这个过程,直到最后剩一个核桃了,直接丢掉。

 有一天,熊怪发现了1543个核桃,请问,它在吃这些核桃的过程中,一共要丢掉多少个核桃。

 请填写该数字(一个整数),不要填写任何多余的内容或说明文字。

答案:5
public class _01熊怪吃核桃 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int ans = 1; // 因为1543是奇数,所以初始化为 1
		for (int i = 1542; i > 0;) { // 不能等于0
			if ((i & 1) == 0) {// 偶数 (1&1==i%2)
				i = i / 2; // 变成它自己的一半
			} else {
				ans++; // 计数,所以掉的数量
				i = (i - 1) / 2;// 奇数先掉1个,除以2
			}
		}
		System.out.println(ans);
	}

}

2.星系炸弹

标题:星系炸弹

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。

请填写该日期,格式为 yyyy-mm-dd  即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。*/

//答案:2017-08-05
可以用excel来做
public class _02星系炸弹 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		c.set(2014, 10,9);//当前时间
		c.add(Calendar.DATE, 1000); //加1000天
		System.out.println(c.getTime().toLocaleString());
	}

}

3.九数分三组

标题:九数分三组

/*
九数分三组

1~9的数字可以组成3个3位数,设为:A,B,C,  现在要求满足如下关系:
B = 2 * A
C = 3 * A

请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。

注意:只提交A的值,严格按照格式要求输出。*/

//全排列
答案:192 219 273 327 
public class _03九数分三组 {

	/**
	 * @param args
	 */
	static int[] arr = {1,2,3,4,5,6,7,8,9};
	
	public static void main(String[] args) {
		f(0); //从0开始
	}
	
	private static void f(int k){
		
		if(k == 9){ //全排好
			//组成3个3位数,就是说明是  个 ,十 ,百 三位
			int a = arr[0]*100 + arr[1]*10 + arr[2];
			int b = arr[3]*100 + arr[4]*10 + arr[5];
			int c = arr[6]*100 + arr[7]*10 + arr[8];
			/*
			 * 要满足的条件
			 * B = 2 * A
			 * C = 3 * A
			 */
			if(b == 2*a && c == 3*a){
				//写出A的所有可能答案,数字间用空格分开,数字按升序排列。
				System.out.print(a+" ");
			}
			
		}
		
		for(int i = k ; i < 9 ; i++){
			int t = arr[k];
			arr[k] = arr[i];
			arr[i] = t;
			
			f(k+1); //递归加1
			
			//回溯
			t = arr[k]; 
			arr[k] = arr[i];
			arr[i] = t;
		}
	}

}

6.加法变乘法

加法变乘法

我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。*/

//答案:16
public class _06加法变乘法 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for(int i = 1 ; i <= 46 ; i++){ //第一个乘号最多只能到46,因为后面还有一个
			for(int j = i + 2 ; j <= 48 ; j++){ //i+2是隔2放乘号
				if(i*(i+1) - (i+i+1) + j*(j+1)-(j+j+1)==2015-1225){
					System.out.println(i + " " + j);
				}
			}
		}
	}

}

7.牌型种数

/*
牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。
*/
//答案:3598180
/*
 * 分析:
	当前扑克牌都有五种可能,1是一张不拿,2是拿一张、3是拿两张、4是拿三张、5是拿四张,
	那么就可以DFS来解决,当牌数达到13并且当前的牌的标号达到13时就意味着找到了一种。
 */

public class _07牌型种数 {

	static int ans;
	public static void main(String[] args) {
		f(0,0);
		System.out.println(ans);
	}
	

	private static void f(int k , int cnt){
		if(k > 13 || cnt > 13){ //剪枝
			return;
		}
		if(k == 13 && cnt == 13){
			ans++;
			return;
		}
		
		for(int i = 0 ; i < 5 ; i++){
			f(k + 1 , cnt + i);//对应着下一张扑克拿i张
		}
	
	}

}




//方法2
package _A组2015;

/*
 * 思路:
 这道题用递归来做,我们要完成的是从54张牌里面选取13张的牌的所有方案数,牌的点数用1-13表示,
 每张牌抽的可能是0-4张,我们再递归函数fun里设置两个参数,n表示点数,sumn表示当前手中牌的数量,
 当n>13或者sumn>=13结束递归,每次进行5次递归,分别为fun(n+1,sumn)到fun(n+1,sum+4),
 表示当前点数的牌有0-4张,当sumn==13时,cnt+1,即可得出所有方案数。

 */
public class _07牌型种数_2 {

	/**
	 * @param args
	 */
	static int ans;

	public static void main(String[] args) {
		f(0, 0);
		System.out.println(ans);
	}

	private static void f(int n, int sum) {

		if (n > 13) {
			return;
		}
		if (sum >= 13) {
			if (sum == 13) {
				ans++;
				return;
			}
			return;
		}

		f(n + 1, sum);
		f(n + 1, sum + 1);
		f(n + 1, sum + 2);
		f(n + 1, sum + 3);
		f(n + 1, sum + 4);
	}

}


8.移动距离

/*
移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
要求输出一个整数,表示m n 两楼间最短移动距离。

例如:
用户输入:
6 8 2
则,程序应该输出:
4

再例如:
用户输入:
4 7 20
则,程序应该输出:
5

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


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

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

*/

public class _08移动距离 {

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		int w, m, n;
	    Scanner sc = new Scanner(System.in);
	    w = sc.nextInt();
	    m = sc.nextInt();
	    n = sc.nextInt();
	    int rm = m % w == 0 ? m / w : m / w + 1;
	    int rn = n % w == 0 ? n / w : n / w + 1;

	    int cm = 0;
	    int cn = 0;
	    if (rm % 2 == 0) cm = rm * w - m + 1;
	    else cm = w - (rm * w - m);

	    if (rn % 2 == 0) cn = rn * w - n + 1;
	    else cn = w - (rn * w - n);

	    System.out.printf("%d\n", Math.abs(cm - cn) + Math.abs(rm - rn));
	}

}

发布了11 篇原创文章 · 获赞 0 · 访问量 127

猜你喜欢

转载自blog.csdn.net/qq_42847094/article/details/105248275