2015年 第6届 蓝桥杯 Java B组 省赛解析及总结


  • 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师
  1. 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结
  2. 2014年 第05届 蓝桥杯 Java B组 省赛真题详解及小结
  3. 2015年 第06届 蓝桥杯 Java B组 省赛真题详解及小结
  4. 2016年 第07届 蓝桥杯 Java B组 省赛真题详解及小结
  5. 2017年 第08届 蓝桥杯 Java B组 省赛真题详解及小结
  6. 2018年 第09届 蓝桥杯 Java B组 省赛真题详解及小结
  7. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及小结
  8. 2020年 第11届 蓝桥杯 Java B组 第1次模拟赛真题详解及小结(校内模拟)
  9. 2020年 第11届 蓝桥杯 Java B组 第2次模拟赛真题详解及小结
  10. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛 2020.7.5】【Java版】
  11. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
  12. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

目   录

一、三角形面积

二、立方变自身

三、三羊献瑞

四、循环节长度

五、九数组分数

六、加法变乘法

七、牌型种数

八、饮料换购

九、垒骰子

十、生命之树

扫描二维码关注公众号,回复: 11710205 查看本文章

小结


    

一、三角形面积

三角形面积

如【图1】所示。图中的所有小方格面积都是1。

图1.jpg


那么,图中的三角形面积应该是多少呢?

请填写三角形的面积。不要填写任何多余内容或说明性文字。

【答案】:28

【解析】:64-36

二、立方变自身

立方变自身

观察下面的现象,某个数字的立方,按位累加仍然等于自身。
1^3 = 1 
8^3  = 512    5+1+2=8
17^3 = 4913   4+9+1+3=17
...

请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?

请填写该数字,不要填写任何多余的内容或说明性的文字。

【答案】:6

package provincialGames_06_2015;

public class A02_立方变自身 {
	private static int ans;

	public static void main(String[] args) { // 6
		for (int i = 1; i < 99; i++) {
			int i1 = i * i * i;
			int sum = sum(i1);
			if (sum == i) {
				System.out.println(i + " " + i1);
				ans++;
			}
		}
		System.out.println(ans);
	}

	private static int sum(int x) {
		String s = String.valueOf(x);
		int sum = 0;
		for (int i = 0; i < s.length(); i++) {
			sum += s.charAt(i) - '0';
		}
		return sum;
	}
}

三、三羊献瑞

三羊献瑞

观察下面的加法算式:

      祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

图1.jpg

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

【答案】:1085

a b c d
+   e f g b
-------------------
e f c b i

e=1,a=9,f=0,c=b+1,c+g>10

package provincialGames_06_2015;

public class A03_三羊献瑞 {

	public static void main(String[] args) {
		for (int b = 2; b < 9; ++b) {
			for (int d = 2; d < 9; ++d) {
				if (b == d)
					continue;
				for (int g = 2; g < 9; ++g) {
					if (g == b || g == d)
						continue;
					int c = b + 1;
					if (c == b || c == d || c == g)
						continue;
					if (c + g <= 10)
						continue;
					int sum = 9000 + b * 100 + c * 10 + d + 1000 + g * 10 + b;
					for (int i = 2; i < 9; ++i) {
						if (i == b || i == d || i == g || i == c)
							continue;
						if (sum <= (10000 + c * 100 + b * 10 + i) && sum >= (10000 + c * 100 + b * 10 + i)) {
							System.out.printf("%2d%d%d%d\n", 9, b, c, d);
							System.out.printf("%2d%d%d%d\n", 1, 0, g, b);
							System.out.printf("%d\n", sum);
							System.out.printf("---------\n");
						}
					}
				}
			}
		}
	}
}

四、循环节长度

循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。

请仔细阅读代码,并填写划线部分缺少的代码。

    public static int f(int n, int m)
    {
        n = n % m;    
        Vector v = new Vector();
        
        for(;;)
        {
            v.add(n);
            n *= 10;
            n = n % m;
            if(n==0) return 0;
            if(v.indexOf(n)>=0)  _________________________________ ;  //填空
        }
    }

注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。

【答案】:return v.size() - v.indexOf(n)

package provincialGames_06_2015;

import java.util.Vector;

public class A04_循环节长度 {
	public static int f(int n, int m) {
		n = n % m;
		Vector v = new Vector();

		for (;;) {
			v.add(n);
			n *= 10;
			n = n % m;
			if (n == 0)
				return 0;
			if (v.indexOf(n) >= 0)
				return v.size() - v.indexOf(n); // 填空
		}
	}

	public static void main(String[] args) {
		System.out.println(f(11, 13));
		System.out.println(f(7, 18));
	}
}

五、九数组分数

九数组分数

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

public class A
{
    public static void test(int[] x)
    {
        int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
        int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];        
        if(a*3==b) System.out.println(a + " " + b);
    }
    
    public static void f(int[] x, int k)
    {
        if(k>=x.length){
            test(x);
            return;
        }
        
        for(int i=k; i<x.length; i++){
            {int t=x[k]; x[k]=x[i]; x[i]=t;}
            f(x,k+1);
            _______________________________________       // 填空
        }
    }
    
    public static void main(String[] args)
    {
        int[] x = {1,2,3,4,5,6,7,8,9};        
        f(x,0);
    }
}

注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。

【答案】:{int t=x[k]; x[k]=x[i]; x[i]=t;}

package provincialGames_06_2015;

public class A05_九数组分数 {
	public static void test(int[] x) {
		int a = x[0] * 1000 + x[1] * 100 + x[2] * 10 + x[3];
		int b = x[4] * 10000 + x[5] * 1000 + x[6] * 100 + x[7] * 10 + x[8];
		if (a * 3 == b)
			System.out.println(a + " " + b);
	}

	public static void f(int[] x, int k) {
		if (k >= x.length) {
			test(x);
			return;
		}

		for (int i = k; i < x.length; i++) {
			{
				int t = x[k];
				x[k] = x[i];
				x[i] = t;
			}
			f(x, k + 1);
			{
				int t = x[k];
				x[k] = x[i];
				x[i] = t;
			} // 填空
		}
	}

	public static void main(String[] args) {
		int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		f(x, 0);
	}
}

六、加法变乘法

加法变乘法

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

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

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

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

【答案】:16

package provincialGames_06_2015;

public class A06_加法变乘法 {

	public static void main(String[] args) {
		for (int i = 1; i <= 46; i++) {
			for (int j = i + 2; j <= 48; j++) {
				if (i * (i + 1) - (i + i + 1) + j * (j + 1) - (j + j + 1) == 2015 - 1225)
					System.out.println(i + " " + j);
			}
		}
	}

}

七、牌型种数

牌型种数

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

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

【答案】:3598180

package provincialGames_06_2015;

public class A07_牌型种数 {

	private static int ans;

	public static void main(String[] args) {
		f(0, 0);
		System.out.println(ans);
	}
	//13堆牌,每堆4个, 每堆可选0到4个, 只要牌的总数为13即可
	//k: 哪种牌;   cnt: 总共分配了几张牌
	private static void f(int k, int cnt) {
		if (k > 13 || cnt > 13)
			return;
		if (k == 13 && cnt == 13) {
			ans++;
			return;
		}
		//cnt 每一种牌出现的次数,cnt逐步上升
		//cnt==13,牌型种数+1,返回
		for (int i = 0; i < 5; i++) {
			f(k + 1, cnt + i);
		}
	}

}

八、饮料换购

饮料换购

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能得到多少瓶饮料。

输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数

例如:
用户输入:
100
程序应该输出:
149

用户输入:
101
程序应该输出:
151


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


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

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

package provincialGames_06_2015;

import java.util.Scanner;

public class A08_饮料换购 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int ans = 0;
		while (n >= 3) {
			n -= 2;
			ans += 3;
		}
		ans += n;
		System.out.println(ans);
	}

}

九、垒骰子

垒骰子

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~

「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 不能紧贴在一起。

「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。

「样例输入」
2 1
1 2

「样例输出」
544

「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36


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


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

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

package provincialGames_06_2015;

import java.util.Scanner;

public class A09_垒骰子 {
	static int op[] = new int[7];
	private static int n;
	private static int m;
	private static final long MOD = 1000000007;

	static void init() {
		op[1] = 4;
		op[4] = 1;
		op[2] = 5;
		op[5] = 2;
		op[3] = 6;
		op[6] = 3;
	}

	public static void main(String[] args) {
		init();
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		long conflict[][] = new long[6][6];
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				conflict[i][j] = 1;
			}
		}
		// 建立冲突矩阵
		for (int i = 0; i < m; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			conflict[op[a] - 1][b - 1] = 0;
			conflict[op[b] - 1][a - 1] = 0;
		}
		// 求冲突矩阵的n-1次方
		long[][] mPow_n_1 = mPow(conflict, n - 1);
		// 累加矩阵的每个元素
		long ans = 0;
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				ans = (ans + mPow_n_1[i][j]) % MOD;
			}
		}
		// ans*4^n
		System.out.println(ans * power(4, n) % MOD);
	}
	
	//快速求 i^n
	private static long power(long i, int n) {
		long ans = 1;
		while (n != 0) {
			if ((n & 1) == 1)
				ans = (ans * i) % MOD;
			i = i * i % MOD;
			n >>= 1;
		}
		return ans;
	}

	/* 矩阵的快速幂 */
	private static long[][] mPow(long[][] conflict, int n) {
		long[][] e = new long[6][6];
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				if (i == j)
					e[i][j] = 1;
				else
					e[i][j] = 0;
			}
		}
		while (n != 0) {
			if ((n & 1) == 1) {
				e = mMul(e, conflict);
			}
			conflict = mMul(conflict, conflict);
			n >>= 1;
		}

		return e;
	}

	private static long[][] mMul(long[][] a, long[][] b) {
		long[][] ans = new long[6][6];
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				for (int k = 0; k < 6; k++) {
					ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % MOD;
				}
			}
		}
		return ans;
	}
}

十、生命之树

生命之树

在X森林里,上帝创建了生命之树。

他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。
上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 {a, v1, v2, ..., vk, b} 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。

在这个前提下,上帝要使得S中的点所对应的整数的和尽量大。
这个最大的和就是上帝给生命之树的评分。

经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。

「输入格式」
第一行一个整数 n 表示这棵树有 n 个节点。
第二行 n 个整数,依次表示每个节点的评分。
接下来 n-1 行,每行 2 个整数 u, v,表示存在一条 u 到 v 的边。由于这是一棵树,所以是不存在环的。

「输出格式」
输出一行一个数,表示上帝给这棵树的分数。

「样例输入」
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5

「样例输出」
8

「数据范围」
对于 30% 的数据,n <= 10
对于 100% 的数据,0 < n <= 10^5, 每个节点的评分的绝对值不超过 10^6 。

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


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

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

package provincialGames_06_2015;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class A10_生命之树 {

	private static int n;
	private static long[] w;
	private static List<Integer>[] g;
	private static long ans;
	// List<Integer>[] x = new ArrayList[n+1];

	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream(new File("F:/Java/eclipse-jee-2019-09-R-win32-x86_64/eclipse-workspace/zLanQiao/src/provincialGames_06_2015/data10/in4.txt")));
		// in4.txt 正常运行;in5.txt 栈溢出
		// /Users/zhengwei/workspace/lanqiaobei2019/src/2015_Java_B/data10/in5.txt
		// F:\Java\eclipse-jee-2019-09-R-win32-x86_64\eclipse-workspace\zLanQiao\src\provincialGames_06_2015\data10\in4.txt
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		w = new long[n + 1];
		g = new ArrayList[n + 1];
		initG();
		for (int i = 1; i <= n; i++) {
			w[i] = sc.nextLong();
		}
		for (int i = 0; i < n - 1; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			g[a].add(b); // 无向的邻接表 双向
			g[b].add(a); // 有向图 例外
		}
		dfs(1, 0);
		System.out.println(ans);
	}

	// u作为根所代表的子树有一个最大权和,将其存储在w[u]中
	private static void dfs(int u, int fa) {
		for (int i = 0; i < g[u].size(); i++) {
			Integer child = g[u].get(i);
			if (child == fa)
				continue;
			dfs(child, u);
			if (w[child] > 0)
				w[u] += w[child];
		}
		if (w[u] > ans)
			ans = w[u];
	}

	// 邻接表 在Java中,一般用List来做, 数组List<Integer>[] g = new ArrayList[n+1];
	// 对象数组,只对 对象 进行了 初始化, 还需要 对 数组元素 进行初始化
	private static void initG() {
		for (int i = 0; i < n + 1; i++) {
			g[i] = new ArrayList<Integer>();
		}
	}
}

小结

01 三角形面积 热身 不用编程
02 立方变自身 简单枚举
03 三羊献瑞 简单枚举 小技巧
*04 循环节长度 有坑 逻辑
05 九数组分数 全排列 带分数
06 加法变乘法 简单枚举 小技巧
07 牌型种数 递归
08 饮料换购 模拟
****09 垒骰子 递归-动规-矩阵快速幂
10 生命之树 Java中递归最多1万层

猜你喜欢

转载自blog.csdn.net/weixin_44949135/article/details/108123806
今日推荐