蓝桥杯2022省赛总结

蓝桥杯2022省赛总结,第1张

☀️比赛总结:java大学 B组

目录:

 试题 A: 星期计算

试题 B: 山

试题 C: 字符统计

试题 D: 最少刷题数

试题 E: 求阶乘

试题 F: 最大子矩阵

没时间!!!我感觉我最大的问题就是做不完题目!!最后几题也就看了 一眼!!很可惜其实如果暴力的话还是可以拿点分的(被一道题卡了好久)!!所以我建议大家在做题的时候分配好时间,一些写不来的题 或者性价比不高的题就直接跳过!!先做自己会做能拿分,拿多分的题目!!

试题 A: 星期计算

本题总分:5分

【问题描述】

  已知今天是星期六,请问 20^22天后是星期几?
  天后是星期几?

  注意用数字 1 到 7 表示星期一到星期日。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


🌙 个人思路:

        签到题,但是long和int都装不下,直接想到用BigInteger....算出20^22天后对7求余数,算出的余数

再加上6如果大于7则减7否则直接输出.这是我的第一,其实就是暴力(应该有更好的方法)

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

public class Main {
	public static void main(String[] args) {
		BigInteger k = new BigInteger("20");
		BigInteger m = new BigInteger("7");
		BigInteger l = new BigInteger("6");
		for(int i=0;i<=21;++i){
			k=k.multiply(k);
		}
		m=k.mod(m);
		System.out.print(m.add(l));
	}	
}

试题 B: 山

本题总分:5分

【问题描述】

  这天小明正在学数数。

  他突然发现有些正整数的形状像一座“山”,比如 123565321 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。

  小明数了很久也没有数完,他想让你告诉他在区间 [2022,2022222022] 中有多少个数的形状像一座“山”。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


🌙 个人思路:

        我觉得这道题就是要考虑周全,各种可能或不可能的情况都要想清楚,多一个少一个都不对,这里

可以用一个双指针,一个指头,一个指尾,所有的数字长度要么奇数要么偶数,讨论第一种奇数情况,指

针指到同一个数字的时候代表结束,偶数的时候当头指针大于尾指针则为结束条件,此外再保证头指

针所指的那一段单调不减就好了,因为前面如果单调不减,后一段必然单调不增. (虽然运行要一点时

间但是很好想到)


public class Main {
	public static void main(String[] args) {
		int ans =0;
		for(int i=2022;i<=2022222022;++i){
			if(check(i)){
				System.out.println(i);
				ans++;
			}
		}
		System.out.print(ans);
	}

	private static boolean check(int x) {
		// TODO Auto-generated method stub
		String k = x+"";
		int l = k.length()-1;
		if(k.charAt(0)!=k.charAt(l))return false;
		for(int i=1,m=l-1;i

试题 C: 字符统计

时间限制: 1.0 s 内存限制: 512.0 MB 本题总分:10分

【问题描述】

  给定一个只包含大写字母的字符串 S,请你输出其中出现次数最多的字母。

  如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。

【输入格式】

  一个只包含大写字母

的字符串 S。

【输出格式】

  若干个大写字母,代表答案。

【样例输入】

  BABBACAC

【样例输出】

  AB

【评测用例规模与约定】

  对于 100 %的评测用例,1 ≤ ∣ S ∣ ≤ 10^6


🌙 个人思路: 

        第一次扫描所有字符保存字符中所有不同的字母,第二次扫描就将保存的字符和字符串依次比

较取到最大值,再利用最大值将不是最大值的字符删掉,剩下的字符就是我们要的字符,然后再排序输

出.感觉还是有点暴力了,但是最多只有26个,所以不会超时(这方法并不是很好,还是很麻烦,虽然过

了)

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

public class Main {
	public static void main(String[] args){
		Scanner sr = new Scanner(System.in);
		String s = sr.next();
		char[] as = s.toCharArray();
		ArrayList kr = new ArrayList();
		ArrayList ar = new ArrayList();
		for(int i=0;imax)max=sum;
		}
		for(int i=0;i
试题 D: 最少刷题数

时间限制: 1.0 s    内存限制: 512.0 MB     本题总分:10分

【问题描述】

  小蓝老师教的编程课有 N 名学生,编号依次是 1 ⋯ N。第 i 号学生这学期刷题的数量是 A i  
  对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数。

【输入格式】

  第一行包含一个正整数 N NN。

  第二行包含 N 个整数: A 1 , A 2 , A 3 ,

【输出格式】

  输出 N个整数,依次表示第 1 ⋯ N 号学生分别至少还要再刷多少道题。

【样例输入】

  5
 12 10 15 20 6
【样例输出】

  0 3 0 0 7

【评测用例规模与约定】

  对于 30 % 的数据,1 ≤ N ≤ 1000 , 0 ≤ A i ≤ 1000


  对于 100 % 的数据,1 ≤ N ≤ 100000 , 0 ≤ Ai ≤ 100000。


 🌙 个人思路:

        这道题的思路其实就是求中位数,只要小于中位数的同学的分数比中位数的分数大1就可以了

(这道题只有75分,我也不知道为啥)


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main{
	static int[] num;
	static int[] dp;
	static int k;
	public static void main(String[] args){
		Scanner sr = new Scanner(System.in);
		int N = sr.nextInt();
		int l [] = new int[N];
		num= new int[N];
		int max =0;
		for(int i=0;imax)max=num[i];
		}
		dp = new int[max+1];
		Arrays.sort(num);
		k =num.length;
		for(int i=0;i

试题 E: 求阶乘

时间限制: 1.0 s 内存限制: 512.0 MB  本题总分:15 分

【问题描述】

  满足 N ! 的末尾恰好有 K个 0 的最小的 N 是多少?

  如果这样的 N 不存在输出 − 1 。

【输入格式】

  一个整数 K。

【输出格式】

  一个整数代表答案。

【样例输入】

  2

【样例输出】
  10

【评测用例规模与约定】

  对于 30 % 的数据,1 ≤ K ≤ 10  1 ≤ K ≤ 10^6 
  对于 100 % 的数据,1 ≤ K ≤ 10 ^18


 🌙 个人思路:(看了包会)

        这题跟百度以前的面试题有点像(1...100!有几个0),但这题要反推 ,他要求刚好有k个0的N!中N

的最小值,那么0是由乘以10所得到的,那么10又是怎么来的呢?是由2*5得到的对吧=>那么这道题的

就可以转化为1..N的阶乘谁能贡献出2和5,2是由 0 2 4 6 8来的所以能出5 必然有2 所以2 一定是够

用的 那么问题就是能产生5的数了 能产生5的数 有5 25 125 那么我们只要统计好 有几个数能产生5

就好了。现在目标是产生k个0的最小数,那么可以从小往大递推,比如2个0可以由两个5的因数构成

,也可以由因数为25的数构成,那么我们可以以5为增率递加数据,判断新得到的数字能贡献几个5就可

以了.(再优化的方法要用二分,单纯写只有35分)

        那么在这里讲一下优化后的算法,首先上次分析得来的我们只要找的N的因数5就好了,那么有几

个呢,观察可以发现最多有K个,那么我们不妨控制答案范围在[1,nk]区间中,那么此时就可以结合二分

查找的思想快速找到答案


import java.util.Scanner;

public class Main {
		public static void main(String[] args){
			Scanner sr = new Scanner(System.in);
			long K = sr.nextLong();//输入数据
			//从小到大递推过来 以5为单位递增
			int ans =0;//用ans记录能贡献几个5
			for(long i=5;;i+=5){
				ans+=check(i);//判断i能贡献多少个5
				if(ans>K){
					System.out.print(-1);
					return;
				}else if(ans==K){
					System.out.print(i);
					return;
				}
			}
		}

		private static int check(long x) {
			// TODO Auto-generated method stub
			int k =0;
			for(int i=5;;i*=5){
				if(x%i==0){
					k++;
				}else{
					break;
				}
			}
			return k;
		}
	}		

试题 F: 最大子矩阵

时间限制: 1.0 s  内存限制: 512.0 MB 本题总分:15 分

【问题描述】

  小明有一个大小为 N × M的矩阵,可以理解为一个 N行 M 列的二维数组。我们定义一个矩阵 m的稳定度 f ( m ) 为 f ( m ) = max ⁡ ( m ) − min ⁡ ( m ) ,其中 max ⁡ ( m ) 表示矩阵 m中的最大值,min ⁡ ( m ) 表示矩阵 m中的最小值。现在小明想要从这个矩阵中找到一个稳定度不大于 limit的子矩阵,同时他还希望这个子矩阵的面积越大越好(面积可以理解为矩阵中元素个数)。

  子矩阵定义如下:从原矩阵中选择一组连续的行和一组连续的列,这些行列交点上的元素组成的矩阵即为一个子矩阵。

【输入格式】

  第一行输入两个整数 N ,M表示矩阵的大小。

  接下来 N行,每行输入 M个整数,表示这个矩阵。

  最后一行输入一个整数 limit,表示限制。

【输出格式】

  输出一个整数,分别表示小明选择的子矩阵的最大面积。

【样例输入】

   3   4

   2   0   7  9

   0   6   9  3

   8   3   6  4

   8

【样例输出】

  6

 【样例说明】
  满足稳定度不大于 8 的且面积最大的子矩阵总共有三个,他们的面积都是 6 (粗体表示子矩阵元素):

  2   0   7   9 
  0   6   9   7 
  8   4   6   4 

  2   0   7   9 
  0   6   9   7 
  8   4   6   4 

  2   0   7   9

       0   6 9   7 
  8   4   6   4 

【评测用例规模与约定】

        

对于所有评测用例,0≤ 矩阵元素值,limit ≤ 10^5


 .......等我有时间了再更新,这题我是用暴力做的,只有35分

        

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/919971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)