郑州轻工业大学2019学年第十一届蓝桥杯校内选拔赛Java B组 题解

@郑州轻工业大学蓝桥杯校内选拔赛 题解

笔者自述

前些天参加学校的蓝桥杯校内选拔赛,做完之后感觉题大部分不是很难,就把考场上的代码保存下来,给大家做个简单的注释,和解析。因为后来参加会议,比较忙,所以就到现在才完成。

这里都是我自己的个人看法并非最正解和最好的答案。只是给不会的同学提供一个代码思路。大家有问题的也可以相互讨论,提出见解。

第一次发博,感谢大家支持点,评论。

QQ:1342249698

1.质数问题(填空题)

一个数被称为质数(或素数)是指除开1和它本身两个约数外,没有其他的约数。
不超过10000的数中,最大的质数是多少?

public class test1{
	public static void main(String[] args) {
		for(int i=1;i<10000;i++){					//从1开始到10000开始寻找质数
			for(int j=2;j<i;j++){					//除了1和本身之外能整除
				int a=i%j;							//a为每次除后的余数,为0即能被整除,即不为质数
				if(a==0)
					break;
				if(j+1==i){							//当除数达到 被除数-1 也不能被整数的话,即为质数
					System.out.println(i);
				}
			}
		}
	}
}

2.进制转换(填空题)

请问十六进制数1949对应的十进制数是多少?请特别注意给定的是十六进制,求的是十进制。

1乘于16的三次方
9乘于16的二次方
4乘于16的一次方
9乘于16的零次方

结果相加即可
这道题相对简单一些,直接转换为十进制,连其他进制都不用转换了。送分题

3.组合问题(填空题)

在2019个有区别的球中选3个球放在一个盘子里,请问有多少种选法?

C(2019, 3)  //组合问题,明白人一眼即懂

4.数字问题(填空题)

在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个
数包含数字9,在计算只是算一个数。

public class test4 {			
	public static void main(String[] args) {
		int num =0;								//设总共有num个整数
		for(int i=1;i<2020;i++){     			//从1开始到2019
			int a=i/1000;						//检侧这个数的千位数字
			int b=i%10;							//检测这个数的个位数字
			int c=(i%100-b)/10;					//检测这个数的十位数字
			int d=(i%1000-b-c*10)/100;			//检测这个数的百位数字
			if(a==9||b==9||c==9||d==9){
				System.out.println(i);
				num=num+1;
			}
		}
		System.out.println(num);
	}
}
巧用int型间除法的留整
善用余数确认数字的位数数字

5.元音问题(代码题)

输入一个单词,请输出这个单词中第一个出现的元音字母。
元音字母包括 a, e, i, o, u,共五个。

输入格式
输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
输出一行包含一个字母,为单词中第一个出现的元素字母。若单词中不存在元
音字母,输出字母 n。
样例输入
hello
样例输出
e
样例输入
fly
样例输出
n
评测用例规模与约定
对于所有评测用例,单词中的字母个数不超过 100。

import java.util.Scanner;

public class test5 {
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		String input = Input.next();
		char in[] = input.toCharArray();					//将字符型转换成字符数组储存
		
		for(int i=0;i<in.length;i++){						//从头到尾检测数组的每一个元素
			if(in[i]=='a'||in[i]=='e'||in[i]=='i'||in[i]=='o'||in[i]=='u'){
				System.out.println(in[i]);					
				break;
			}
			if(i+1==in.length)								
				System.out.println('n');
		}
	}
}

6.单词加密(代码题)

给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移 3
位后被替换成密文。即 a变为d,b变为e,…,w变为z,x变为 a,y变为b,z
变为c。
例如,lanqiao会变成 odqtldr。

输入格式
输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
输出一行,表示加密后的密文。
样例输入
lanqiao
样例输出
odqtldr
评测用例规模与约定
对于所有评测用例,单词中的字母个数不超过 100。

import java.util.Scanner;

public class test6 {
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		String input = Input.next();
		char in[] = input.toCharArray();						//将字符型转换成字符数组储存
		
		for(int i=0;i<in.length;i++){
			Character a =Character.valueOf(in[i]);			//因为Character类能够提供更多合适的方法,所以这里将char型转换为Character型
			int code = a.hashCode();						//调用该类方法,获取ASICll码值	
			if(code>96&&code<120) System.out.print(Character.toChars(code+3));		//把对应的ASCll码值增加后转换成字符
			else System.out.print(Character.toChars(code-23));				
		}
	}
}

7.元素最大距离问题(代码题)

在数列 a_1, a_2, …, a_n中,定义两个元素 a_i 和 a_j 的距离为 |i-j|+|a_i-a_j|,
即元素下标的距离加上元素值的差的绝对值,其中 |x| 表示 x 的绝对值。
给定一个数列,请问找出元素之间最大的元素距离。

输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a_1, a_2, …, a_n,相邻的整数间用空格分隔,表示给定
的数列。
输出格式
输出一行包含一个整数,表示答案。
样例输入
5 9 4 2 4 7
样例输出
9
样例说明
a_1 和 a_3 的距离为 |1-3|+|9-2|=9。
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

import java.util.Scanner;

public class test7 {
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		int n = Input.nextInt();
		int abc[] = new int[n];
		int distance,max = 0;
		for(int i=0;i<n;i++){					
			abc[i]=Input.nextInt();
		}										
		
		for(int i=0;i<abc.length;i++){							//从第一个整数开始,
			for(int j=i+1;j<abc.length;j++){					//算和后面整数的距离
				if(abc[i]>abc[j]) distance=j-i+abc[i]-abc[j];		
				else distance=j-i+abc[j]-abc[i];
				if(distance>max) max=distance;					//把距离比最大距离还大的存入最大距离
			}
		}
		System.out.println(max);
	}
}

8.和谐向量问题(代码题)

一个平面向量表示从一个坐标点到另一个坐标点的变化量,一般用两个数 (x, y)
来表示。
两个向量相加是指分别将对应的两个数相加,例如 (x_1, y_1) 与 (x_2, y_2) 相
加后得 (x_1+x_2, y_1+y_2)。
如果两个向量相加后,得到的向量两个值相等,我们称这两个向量为和谐向量
对。例如 (3, 5) 和 (4, 2) 是和谐向量对。
给定 n 个向量,问能找到多少个和谐向量对?

输入格式
输入的第一行包含一个整数 n,表示向量的个数。
接下来 n 行,每行两个整数 x_i, y_i,表示一个向量。
输出格式
输出一行,包含一个整数,表示有多少个和谐向量对。
请注意,自己和自己不能成为一个和谐向量对。
样例输入
5
9 10
1 3
5 5
5 4
8 6
样例输出
2
样例输入
4
1 1
2 2
1 1
2 2
样例输出
6
样例说明
每两个向量组成一个和谐向量对。
评测用例规模与约定
对于 70% 的评测用例,1 <= n <= 1000;
对于所有评测用例,1 <= n <= 100000, -1000000 <= x_i, y_i <= 1000000。

import java.util.Scanner;

public class test8 {
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		int n = Input.nextInt();
		int abc[][] = new int[n][2];
		int sum =0;
		for(int i=0;i<n;i++){								//完成输入
			abc[i][0]= Input.nextInt();
			abc[i][1]= Input.nextInt();
		}								
		
		for(int i=0;i<abc.length;i++){							//从第一个元素开始
			for(int j=i+1;j<abc.length;j++){					//计算和每一个元素是否是和谐向量
				if(abc[i][0]+abc[j][0]==abc[i][1]+abc[j][1]) sum=sum+1;
			}
		}
		System.out.println(sum);
	}

}

9.V字星空问题(代码题)

当夜深人静时,小明喜欢独自凝望着天空。
这一天,小明看着满天的繁星,突发奇思妙想,他发现可以通过用直线连接天
空中的星星来组成美丽的图案。
小明想到一个非常简单的图案:大写的 V,如果连接三颗星星,中间一颗最靠
下方,这样的形状就是一个大 V了。
小明越想越着迷,他想知道,天空中最亮的 n 颗星星,可以有多少种方式组
成大V。
为了更严谨的看待问题,小明把自己所见范围的天空映射到了一个平面直角坐
标系中,他看到的最亮的 n 颗星星在这个坐标系中都有自己的坐标。
如果三颗星星的坐标分别为 (x_i, y_i), (x_j, y_j), (x_k, y_k),当 x_i < x_j < x_k
且 y_j < y_i 且 y_j < y_k 时,这三颗星星就组成了一个大 V。

输入格式
输入的第一行包含一个整数 n 。
接下来 n 行,每行两个整数,每一行表示一颗星星的 x 坐标和 y 坐标。
输出格式
输出一行包含一个整数,表示有多少种方式组成大 V。
样例输入
5
4 5
2 3
1 4
3 3
5 8
样例输出
4
评测用例规模与约定
对于 30% 的评测用例,2 <= n <= 50,星星的坐标为不超过 1000 的非负
整数。
对于 50% 的评测用例,2 <= n <= 100,星星的坐标为不超过 1000 的非负
整数。
对于 80% 的评测用例,2 <= n <= 1000,星星的坐标为不超过 10000 的
非负整数。
对于所有评测用例,2 <= n <= 5000,星星的坐标为不超过 100000 的非负
整数。

import java.util.Scanner;

public class test9 {
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		int n = Input.nextInt();
		int abc[][] = new int[n][2];
		int sum =0;
		for(int i=0;i<n;i++){
			abc[i][0]= Input.nextInt();
			abc[i][1]= Input.nextInt();
		}															//完成输入
		
		for(int i=0;i<abc.length;i++){								//选取第一个点
			for(int j=i+1;j<abc.length;j++){							//之后选取第二个点
				for(int k=j+1;k<abc.length;k++){							//之后选取第三个点
					//看三个点是否满足当题中( x_i < x_j < x_k 且 y_j < y_i 且 y_j < y_k)
					//三个点的排列一共有6种情况,直接进行判断,是否符合这6种情况的其中一种
					if((abc[i][0]<abc[j][0]&&abc[j][0]<abc[k][0])&&(abc[j][1]<abc[i][1])&&(abc[j][1]<abc[k][1]))sum=sum+1;
					else if((abc[k][0]<abc[j][0]&&abc[j][0]<abc[i][0])&&(abc[j][1]<abc[i][1])&&(abc[j][1]<abc[k][1]))sum=sum+1;
					else if((abc[k][0]<abc[i][0]&&abc[i][0]<abc[j][0])&&(abc[i][1]<abc[k][1])&&(abc[i][1]<abc[j][1]))sum=sum+1;
					else if((abc[j][0]<abc[i][0]&&abc[i][0]<abc[k][0])&&(abc[i][1]<abc[k][1])&&(abc[i][1]<abc[j][1]))sum=sum+1;
					else if((abc[i][0]<abc[k][0]&&abc[k][0]<abc[j][0])&&(abc[k][1]<abc[i][1])&&(abc[k][1]<abc[j][1]))sum=sum+1;
					else if((abc[j][0]<abc[k][0]&&abc[k][0]<abc[i][0])&&(abc[k][1]<abc[i][1])&&(abc[k][1]<abc[j][1]))sum=sum+1;
				}
			}
		}
		System.out.println(sum);
	}
}

	这道题这样做更多算是套做,因为只有三个点,三个点能组成的排列阵容只有6个,相对来说少,只要其中一个
排列阵容能够符合题中要求( x_i < x_j < x_k 且 y_j < y_i 且 y_j < y_k),就算成立V形星星。
	当然这种算法是在这种情况少的情况下才能够使用。就像计算1+2+3+...+5,一个一个算能算的过来;而当计算
1+2+3+4+...+100,就要必须借助求和公式了。
	因为是在考试,时间紧迫,就用了套做,把3个点排列的6种情况列举出来,一个一个情况对照。并非最优最正解。

10.最长水渠问题(代码题)

受大西线调水工程启发,小明也准备设计一条调水的水渠。 小明经费有限,他只能在一块有限区域内建立一条简单的水渠。 小明首先勘探了地形,在这块地中有一处水源,必须用作水渠的起点。另外,小明还测量了一些点,包括点的位置和高度。如果两个小明测量的点之间的距离不超过 d 且高度不同,小明就可以在这两点之间建立一段水渠,让水从高处流向低处,这一段的长度为两点之间的直线距离(即将横坐标的差的平方加上纵坐标的差的平方加上高度差的平方后再开平方根)。 小明计划只修一条主水渠,不建立分支的水渠。由于水渠能影响的范围与水渠的长度正相关,小明希望水渠尽可能长。
请注意,水渠必须从水源开始修,并且高度应当递减。水渠的不同段可能交叉
(建个桥即可)。

输入格式
输入的第一行包含一个整数 n ,表示小明已经测量的点数。 接下来 n 行,每行三个整数 x, y, h,分别表示测量的点坐标为 (x, y),高度为 h。这部分的第一个点即为水源,第一个点的 h值大于其他点的 h值。 接下来一行包含一个整数 d。
输出格式
输出一行,包含一个实数,四舍五入保留 2 位小数,表示水渠最长能修多长。
样例输入
5
1 1 10
2 3 8
4 5 9
1 2 5
4 5 5
8
样例输出
10.66
样例说明
在这些点中有两个坐标为 (4, 5) 的点,这是允许的。
评测用例规模与约定
对于 30% 的评测用例,1 <= n <= 10;
对于 60% 的评测用例,1 <= n <= 20;
对于所有评测用例,1 <= n <= 1000,0 <= h <= 10000,0 <= x, y <= i
10000,0 < d < 1e7(10 的7次方)。

import java.util.Scanner;

public class test10{
	public static void main(String[] args) {
		Scanner Input = new Scanner(System.in);
		int n = Input.nextInt();							//录入数量n
		double abc[][] = new double[n][3];
		int d=0;
		double sum=0;
		for(int i=0;i<n;i++){								//录入各点
			abc[i][0]= Input.nextInt();		
			abc[i][1]= Input.nextInt();
			abc[i][2]= Input.nextInt();
		}
		d=Input.nextInt();									//录入最大距离d

		/*算法是这样的:
		
				首先最大距离,可以肯定的是水渠一定是从最高的流入次高的点,再流入次次高的点
				就比如 三个点 高度为 10  8  5  水渠最大长度一定是从10→8→5这样流的 不是10直接到5  
				
				当然 第二最高可能有两个点  都在h2的高度 但是xy坐标不同 
				那么 第一最高点到第二最高点就不一定只有一个路径 因为第二最高点有两个点 
				(就像 1 1 10 → 4 5 9  和 1 1 10→ 1 2 9)   
				
				所以把第一最高点到第二最高点的几条路径里挑取一个最大距离的 流到那个点上
				随后再从流到的第二最高点 算到第三最高点的几条路径里挑取一个最大距离 再流到下一个点上
				...依次类推
				
				一直流到最低点 把流经的点连起来 就是最长水渠了
				把几个相邻高度的两点的最大距离留存 最后相加就是了
				
				    		
		*/
		
		double x=abc[0][0],y=abc[0][1],h=abc[0][2];			//记录水目前在的位置
		
		for(;;)								
		{
		
			/*1.先找出下一最高点的高度*/
			
			double nextmaxheigh = -1;						//定义下一最大高度
			for(int j=0;j<abc.length;j++){					//找出下一最大高度
				if(abc[j][2]>nextmaxheigh&&abc[j][2]<h){
					nextmaxheigh=abc[j][2];
				}
			}
			if(nextmaxheigh==-1)break;
			//当下一最大高度是负数,即为初始定义值时,水已经流到最低了,循环结束
			
			
			
			/*2.再找出当前水的位置流到下一最高位置的最大距离*/
			
			double x1=0,y1=0,h1=0;					//定义水要流到的下一位置的坐标
			double maxlong = 0;						//定义水流到的下一最高点的最远距离
			for(int j=1;j<abc.length;j++){
				if(nextmaxheigh==abc[j][2]){			//筛选出下一最高点
					double s=Math.sqrt((x-abc[j][0])*(x-abc[j][0])+(y-abc[j][1])*(y-abc[j][1]));
					if(s>maxlong&&s<d){				//筛选流向下一最高点的最大距离 并记录该点坐标
						maxlong=s;					
						x1=abc[j][0];
						y1=abc[j][1];
						h1=abc[j][2];
					}
				}
			}
			x=x1;y=y1;h=h1;			//把水流到的新位置赋值给 水的当前位置
			sum=sum+maxlong;		//把相邻高度两点的最大距离叠加  算出最后最大长度的水渠
		}
		
		System.out.println(String.format("%.2f", sum));
	}
}


这道题有个盲区需要注意,算两点距离的时候,不能把高度算上。只算平面距离。
这可能和题目描述不相符,但否则无法的出样例输出。

最后,这道题这样做并非正解,但能够理性得出答案。如果大家有更好的正解,也可以联系我呀。
欢迎来访
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值