第十二届蓝桥杯省赛Java C 组赛后复盘

总体来说难度不是很大,打比赛的时候,因为基础不太行,差不多只会暴力,看见关于树和图的题目直接跳过(太菜了太菜了菜哭了)

试题 A: ASCLL

【问题描述】
已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
考试情况
送分题,可以直接掰着手指头数出来,还是写了段代码,怕数错了。答案76。

public class Main {
	public static void main(String[] args){		
		
		for(int i=56;i<80;i++) {
			System.out.println(i+":"+(char)i);
		}	
		
	}		
}

答案76

试题 B: 空间

【问题描述】
小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB 的空间可以存储多少个 32 位二进制整数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
考试情况
第一眼很蒙,我刷真题没刷到这种。就放到最后写了。
然后把KB弄掉了,少乘一次1024直接无了;

试题 C: 卡片

【问题描述】
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1
拼到多少?
提示:建议使用计算机编程解决问题。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
考试情况
直接暴力跑,答案3181;上代码
考试写的代码太乱了while里面可以不用if判断直接写a[m]+=1;就简洁多了

public class Main {
	public static void main(String[] args){		
		
		int a[]=new int[10];
		int x=0;
		for(int i=1;i<10000;i++) {
			int tmp=i;
			while(i>0) {
				int m=i%10;
				i=i/10;
				if(m==0) {
					a[0]+=1;
				}
				if(m==1) {
					a[1]+=1;
				}
				if(m==2) {
					a[2]+=1;
				}
				if(m==3) {
					a[3]+=1;
				}
				if(m==4) {
					a[4]+=1;
				}
				if(m==5) {
					a[5]+=1;
				}
				if(m==6) {
					a[6]+=1;
				}
				if(m==7) {
					a[7]+=1;
				}
				if(m==8) {
					a[8]+=1;
				}
				if(m==9) {
					a[9]+=1;
				}
								
			}
			i=tmp;
			for(int j=0;j<10;j++) {
				if(a[j]>=2021) {
					System.out.println(i);
					x=1;
					break;
				}
			}
			if(x==1) {
				break;
			}
		}
		
	}	
	
}

在这里插入图片描述

试题 D: 相乘

【问题描述】
小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以1000000007 的余数,会得到不同的数。小蓝想知道,能不能在 1 至 1000000007 之间找到一个数,与 2021 相乘后再除以 1000000007 后的余数为 999999999。如果存在,请在答案中提交这个数;如果不存在,请在答案中提交 0。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
考试情况
调用BigInteger,直接跑,大数类不能直接比较,跑了几遍好久没结果,又转换一波,答案17812964;

import java.math.BigInteger;

public class Main {
	public static void main(String[] args){		
		
		BigInteger a=new BigInteger("1000000007");
		BigInteger b=new BigInteger("2021");
		BigInteger c=new BigInteger("500000");
		BigInteger d=new BigInteger("1");
		
		while(true) {
			c=c.add(d);
			BigInteger t=c.multiply(b).mod(a);			
			String s=t.toString();
			long l=Integer.valueOf(s);
			if(l==999999999) {
				System.out.println(c);
				break;
			}
			
		}
	}	
	
}

在这里插入图片描述

试题 E: 路径

问题描述】
小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
小蓝的图由 2021 个结点组成,依次编号 1 至 2021。对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条
长度为 a 和 b 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。
请计算,结点 1 和结点 2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
考试情况
一看感觉比较麻烦,就跳过了,后面就剩下20分钟,写了个贪心,跑出来20亿的一个数,肯定错了,还是填了;看别人正确答案好像是10266837;

试题 F: 时间显示

时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
【输入格式】
输入一行包含一个整数,表示时间。
【输出格式】
输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值为 0 到 23,MM 表示分,值为 0 到 59,SS 表示秒,值为 0 到 59。时、分、秒不足两位时补前导 0。
【样例输入 1】
46800999
【样例输出 1】
13:00:00
【样例输入 2】
1618708103123
【样例输出 2】
01:08:23
【评测用例规模与约定】
对于所有评测用例,给定的时间为不超过 10^18 的正整数。
考试情况
简单题,一开始逻辑错了一丢丢,关键第一个数据跑出来还是正确的,第二个数据跑不成功。十分郁闷,一度以为题目打印错了,我又感觉我的逻辑好像有一点问题;就先跳过了,后面从写了一次就好了;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){		
		Scanner sc=new Scanner(System.in);
		long  n=sc.nextLong();
		
		 long zm=n/1000;
		 long m=zm%60;
		 long zf=zm/60;
		 long f=zf%60;
		 long zs=zf/60;
		 long s=zs%24;
		 String s1,s2,s3;
		 if(m<10) {
			 s3="0"+String.valueOf(m);
		 }else {
			 s3=String.valueOf(m);
		 }
		 if(f<10) {
			 s2="0"+String.valueOf(f);
		 }else {
			 s2=String.valueOf(f);
		 }
		 if(s<10) {
			 s1="0"+String.valueOf(s);
		 }else {
			 s1=String.valueOf(s);
		 }
		 System.out.println(s1+":"+s2+":"+s3);
	}	
	
}

在这里插入图片描述

试题 G: 最少砝码

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?注意砝码可以放在天平两边。
【输入格式】
输入包含一个正整数 N。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
【样例输出】
3
【样例说明】
3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
少于 3 个砝码不可能称出 1 至 7 的所有重量。
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 1000000000。
考试情况
没写

试题 H: 杨辉三角形

时间限制: 5.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
下面的图形是著名的杨辉三角形:

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, …
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
【输入格式】
输入一个整数 N。
【输出格式】
输出一个整数代表答案。
【样例输入】
6
【样例输出】
13
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ N ≤ 10;
对于所有评测用例,1 ≤ N ≤ 1000000000。
考试情况
没想到什么比较好的办法,直接生成二维数组,暴力跑;
这时候就比较傻逼了,我把二维数组取100X100,拉到最后一行看生成值有8992356282111564080这么大,比题目要求的1000000000大太多了,就以为够了。100X100也才1w个数,这生成的杨辉三角远远不足1w;评测的数据是10亿;应该可以得部分分,太xx了。

试题 I: 左孩子右兄弟

时间限制: 2.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任意顺序连接右兄弟。给定一棵包含 N 个结点的多叉树,结点从 1 至 N 编号,其中 1 号结点是根,每个结点的父结点的编号比自己的编号小。请你计算其通过 “左孩子右兄弟” 表示法转化成的二叉树,高度最高是多少。注:只有根结点这一个结点的树高度为 0 。
例如如下的多叉树:

可能有以下 3 种 (这里只列出 3 种,并不是全部) 不同的 “左孩子右兄弟”
表示:

其中最后一种高度最高,为 4。
【输入格式】
输入的第一行包含一个整数 N。以下 N −1 行,每行包含一个整数,依次表示 2 至 N 号结点的父结点编号。
【输出格式】
输出一个整数表示答案。
【样例输入】
5
1
1
1
2
【样例输出】
4
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ N ≤ 20;
对于所有评测用例,1 ≤ N ≤ 100000。
考试情况
没写

试题 J: 双向排序

时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
给定序列 (a 1 ,a 2 ,··· ,a n ) = (1,2,··· ,n),即 a i = i。小蓝将对这个序列进行 m 次操作,每次可能是将
a 1 ,a 2 ,··· ,a q i 降序排列,或者将 a q i ,a q i +1 ,··· ,a n 升序排列。请求出操作完成后的序列。
【输入格式】
输入的第一行包含两个整数 n, m,分别表示序列的长度和操作次数。接下来 m 行描述对序列的操作,其中第 i 行包含两个整数 p i , q i 表示操作类型和参数。当 p i = 0 时,表示将 a 1 ,a 2 ,··· ,a q i 降序排列;当 p i = 1 时,表示将 a q i ,a q i +1 ,··· ,a n 升序排列。
【输出格式】
输出一行,包含 n 个整数,相邻的整数之间使用一个空格分隔,表示操作完成后的序列。
【样例输入】
3 3
0 3
1 2
0 2
【样例输出】
3 1 2
【样例说明】
原数列为 (1,2,3)。
第 1 步后为 (3,2,1)。
第 2 步后为 (3,1,2)。
第 3 步后为 (3,1,2)。与第 2 步操作后相同,因为前两个数已经是降序了。
【评测用例规模与约定】
对于 30% 的评测用例,n,m ≤ 1000;
对于 60% 的评测用例,n,m ≤ 5000;
对于所有评测用例,1 ≤ n,m ≤ 100000,0 ≤ a i ≤ 1,1 ≤ b i ≤ n。
考试情况
虽然是最后一题,可能写得人不会太多,我前面跳过太多题了,直接就跳到最后一题了,我看完了题目,思路比较明确。就开始写了,有部分代码重复,我就复制了一下,里面有个变量要修改,没改,就多折腾了差不多30分钟,还是有点慌,,,

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){		
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int m=sc.nextInt();
		int a1[]=new int[n+1];
		int a2[][]=new int[m][2];
		for(int i=1;i<=n;i++) {
			a1[i]=i;
		}
		for(int i=0;i<m;i++) {
			for(int j=0;j<2;j++) {
				a2[i][j]=sc.nextInt();
			}
		}
		for(int i=0;i<m;i++) {
			
			if(a2[i][0]==1) {
				int t=a2[i][1];
				Arrays.sort(a1, t, n+1);
			}else {
				int t=a2[i][1];
				int a3[]=Arrays.copyOfRange(a1, 1, t+1);
				Arrays.sort(a3);
				for(int w=0;w<a3.length;w++) {
					a1[t]=a3[w];
					t--;
				}
			}
					
		}
	
		
		for(int i=1;i<=n;i++) {
			System.out.print(a1[i]+" ");
		}
		
		}

	}	
	


在这里插入图片描述

最后小结

后面写大题一看一脸蒙,还是很慌的,虽然因为很多细节浪费了不少时间,但是再给时间也就差不多这样了,不会的是真不会。


可能大家都比较菜吧,但我运气好一点

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值