蓝桥杯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));
}
}