第十一届蓝桥杯校内赛/校内选拔赛(2020蓝桥杯校选3-java)部分解题思路

6 篇文章 0 订阅
6 篇文章 0 订阅

一、问题描述
  在计算机存储中,15.125GB是多少MB?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

计算机二进制1GB=1024MB;

答案:15488

二、问题描述
  一个数被称为质数(或素数)是指除开1和它本身两个约数外,没有其他的约数。
  在不超过10000的数中,一共有多少个质数?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:1229

//求范围内的质数数量
public class Main {

	public static void main(String[] args) {
		int count = 1;
				 int j;
		     for(int i = 2; i <= 10000; i++){
		         j = 2;
		         while (i%j != 0){
		             j++;
		             if(j==i){
		            	 count++;
		             }
		         }
		     }
		     System.out.println(count);
			}
		}

曾看过一个题目是求1-10000的质数有哪些?

//求范围内的具体质数
public class Main {
	public static void main(String[] args) {
		System.out.println("2");
		 int j;
     for(int i = 2; i <= 10000; i++){
         j = 2;
         while (i%j != 0){
             j++;
             if(j==i){
            	 System.out.println(i);
             }
         }
     }
	}
}

 

三、问题描述
  一个包含有2019个结点的无向连通图,最少包含多少条边?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

如下图所示为一个无向连通图:任何两个节点之前都是连通的,都存在一条路径,并且图中没有方向。

有n个顶点的无向连通图最多有n(n-1)/2条边(构成一个无向完全图的情况);
最少有n-1条边(n个顶点是连通的);

答案:2018

四、问题描述
  一个包含有2019个结点的有向图,最多包含多少条边?(不允许有重边)
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

如下图所示为一个有向图:一幅有向图是由一组顶点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。

 一个具有n个顶点的有向图最多有n(n-1)条边;

答案:4074342

五、问题描述
  小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
  给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
  元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出答案,或者为yes,或者为no。
样例输入
lanqiao
样例输出
yes
样例输入
world
样例输出
no
评测用例规模与约定
  对于所有评测用例,单词中的字母个数不超过100。

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		
		Set<Character> fset = new HashSet<>();
		Set<Character> yset = new HashSet<>();
		for (char i = 'a'; i <= 'z'; i++) {
			if (i == 'a' || i == 'e' || i == 'i' || i == 'o' || i == 'u') {
				yset.add(i);
			} 
        else {
				fset.add(i);
			}
		}
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		int p = 0, aa = 0, bb = 0, cc = 0, dd = 0;
		while (p < str.length() && fset.contains(str.charAt(p))) {
			aa = 1;
			p++;
		}
		while (p < str.length()  && yset.contains(str.charAt(p))) {
			bb = 1;
			p++;
		}
		while (p < str.length()  && fset.contains(str.charAt(p))) {
			cc = 1;
			p++;
		}
		while (p < str.length() && yset.contains(str.charAt(p))) {
			dd = 1;
			p++;
		}
		if (p == str.length() && aa == 1 && bb == 1 && cc == 1 && dd == 1) {
			System.out.println("yes");
		} else {
			System.out.println("no");
		}
	}
}

六、问题描述
  给定一个单词,请使用凯撒密码将这个单词加密。
  凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,...,w变为z,x变为a,y变为b,z变为c。
  例如,lanqiao会变成odqtldr。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出一行,表示加密后的密文。
样例输入
lanqiao
样例输出
odqtldr
评测用例规模与约定
  对于所有评测用例,单词中的字母个数不超过100。

//小写或大写字母加密
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String a = input.nextLine();
		int key = 3;
		Encryption(a,key);
		input.close();
	}
		public static void Encryption(String arr,int k) {
			String string ="";
			for(int i=0;i<arr.length();i++) {
				char c = arr.charAt(i);
				if(c>='a'&&c<='z') {    //如果字符串中的某个字符是小写字母
				c+=k%26;  //移动key%26位
				if(c<'a')
					c+=26;//向左超界
				if(c>'z')
					c-=26;//向右超界
				}
				else if(c>='A'&&c<='Z') //如果字符串中的某个字符是大写字母
				{
					c+=k%26;//移动key%26位
					if(c<'A')
						c+=26;//向左超界
					if(c>'Z')
						c-=26;//向右超界
				}
				string +=c;//将解密后的字符连成字符串
			}
			System.out.println(string);
		}
}

 曾见过一个题目是解密的,如下:

//小写或大写字母解密
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String a = input.nextLine();
		int key = 3;
		Decrypt(a,key);
		input.close();
	}
	
	public static void Decrypt(String str, int n) {
		// TODO Auto-generated method stub
		//解密
		int k=Integer.parseInt("-"+n);
		String string="";
		for(int i=0;i<str.length();i++) {
			char c=str.charAt(i);
			if(c>='a'&&c<='z')//如果字符串中的某个字符是小写字母
			{
				c+=k%26;//移动key%26位
				if(c<'a')
					c+=26;//向左超界
				if(c>'z')
					c-=26;//向右超界
			}else if(c>='A'&&c<='Z')//如果字符串中的某个字符是大写字母
			{
				c+=k%26;//移动key%26位
				if(c<'A')
					c+=26;//向左超界
				if(c>'Z')
					c-=26;//向右超界
			}


				string +=c;//将解密后的字符连成字符串
			}
			System.out.println(string);
		}
}

七、问题描述
  给定正整数 n,请问在整数 1 至 n 中,数字中没有数位相同的数有多少个?
  例如,当 n=30 时,除开 11 和 22 以外,其他的数都没有数位相同,因此答案为 28。
输入格式
  输入的第一行包含一个整数 n。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
30
样例输出
28
评测用例规模与约定
  对于 40% 的评测用例,1 <= n <= 1000。
  对于 80% 的评测用例,1 <= n <= 100000。
  对于所有评测用例,1 <= n <= 1000000。

import java.util.Scanner;
public class Main {
	public static boolean check(int i){
		int arr[]=new int[10];
		while(i>0){
			arr[i%10]++;
			i/=10;
		}
		for(int j=0;j<10;j++)
			if(arr[j]>1) return false;
		return true;
	}
	public static void main(String[] args) {
		int count=0;
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		for(int i=1;i<=n;i++)
			if(check(i)) count++;
		System.out.println(count);
		sc.close();
	}
}

八、问题描述
  当夜深人静时,小明喜欢独自凝望着天空。
  这一天,小明看着满天的繁星,突发奇思妙想,他发现可以通过用直线连接天空中的星星来组成美丽的图案。
  小明想到一个非常简单的图案:大写的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 Main {
	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);
	}
}

九、问题描述
  小明开了一家花店,这天,有个客户定了非常多的花,按客户的需要,这些花要排成 n 行 m 列。
  小明要将这些花运送到客户那,然而由于花太多,需要分两辆车才能装下。
  小明怕自己弄错花的顺序,因此在分车的时候,他准备将前面一些列(注意不是行)的花放在第一辆车上,将其实的花放在第二辆车上。
  已知每盆花的重量,要使第一辆车和第二辆车尽可能总重量一致,请帮助小明分装这些花,请告诉小明两辆车的重量最小差多少。
输入格式
  输入的第一行包含两个整数 n, m,分别表示行数和列数。
  接下来 n 行,每行 m 个正整数,分别表示每盆花的重量。
输出格式
  输出一个整数,表示总重量最接近时两车的重量之差(的绝对值)。
样例输入
3 4
1 2 3 9
5 6 7 8
2 3 4 9
样例输出
7
样例说明
  将前 3 列放一辆车,后 1 列放一辆车,第一辆比第二辆重 7 。
评测用例规模与约定
  对于 30% 的评测用例,2 <= n, m <= 20。
  对于 70% 的评测用例,2 <= n, m <= 100。
  对于所有评测用例,2 <= n, m <= 1000,每盆花的重量不超过 1000。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		long mi=200000000L;
		int cur=0;
		int sum=0;
		int n=sc.nextInt(),m=sc.nextInt();
		int arr[][]=new int[n][m];
		int ans[]=new int[m];
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				arr[i][j]=sc.nextInt();
				sum+=arr[i][j];
				ans[j]+=arr[i][j];
			}
		}
		for(int i=0;i<ans.length;i++){
			cur+=ans[i];
			mi=mi<Math.abs(sum-cur-cur)?mi:Math.abs(sum-cur-cur);
		}
		System.out.println(mi);
		sc.close();
	}
}

十、问题描述
  2015年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。
  这一次,小明要帮助 n 个村庄通电,其中 1 号村庄正好可以建立一个发电站,所发的电足够所有村庄使用。
  现在,这 n 个村庄之间都没有电线相连,小明主要要做的是架设电线连接这些村庄,使得所有村庄都直接或间接的与发电站相通。
  小明测量了所有村庄的位置(坐标)和高度,如果要连接两个村庄,小明需要花费两个村庄之间的坐标距离加上高度差的平方,形式化描述为坐标为 (x_1, y_1) 高度为 h_1 的村庄与坐标为 (x_2, y_2) 高度为 h_2 的村庄之间连接的费用为
  sqrt((x_1-x_2)*(x_1-x_2)+(y_1-y_2)*(y_1-y_2))+(h_1-h_2)*(h_1-h_2)。
  在上式中 sqrt 表示取括号内的平方根。请注意括号的位置,高度的计算方式与横纵坐标的计算方式不同。
  由于经费有限,请帮助小明计算他至少要花费多少费用才能使这 n 个村庄都通电。
输入格式
  输入的第一行包含一个整数 n ,表示村庄的数量。
  接下来 n 行,每个三个整数 x, y, h,分别表示一个村庄的横、纵坐标和高度,其中第一个村庄可以建立发电站。
输出格式
  输出一行,包含一个实数,四舍五入保留 2 位小数,表示答案。
样例输入
4
1 1 3
9 9 7
8 8 6
4 5 4
样例输出
17.41
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 10;
  对于 60% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 1000,0 <= x, y, h <= 10000。

(新手上路,大神勿喷,请多多指教)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值