第十届蓝桥杯 2019年省赛真题 (Java 大学C组 )

举报
随性. 发表于 2022/03/16 16:29:00 2022/03/16
【摘要】 蓝桥杯---Java大学C组---个人赛日常刷题【day6】

蓝桥杯 2019年省赛真题 (Java 大学C组 )


第一题-A:求和

题目:

【问题描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包
括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 2019 中,所有这样的数的和是多少?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:用函数把里边包含0~9的数字取出来然后++即可。

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int sum=0;
		for (int i = 1; i <=2019; i++) {
			String str=i+"";
			if (str.contains("0")) {
				sum=sum+i;
			}else if(str.contains("1")) {
				sum=sum+i;
			}else if(str.contains("2")) {
				sum=sum+i;
			}else if(str.contains("9")) {
				sum=sum+i;
			}
			
		}
		System.out.println(sum);
    }
}

第二题-B:矩形切割

题目:

【问题描述】
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方
形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。
例如,对于一块两边分别为 5 和 3 的材料(记为 5 × 3),小明会依次切出
3 × 3、2 × 2、1 × 1、1 × 1 共 4 个正方形。
现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:判断两边的大小,来计算正方形。

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int count = 0;
		while(true) {
			if (n < m) {
				m = m - n;
				count++;
			} else if (n > m) {
				n = n - m;
				count++;
			} else if (n == m) {
				count++;
				break;
			}
			
		}
		System.out.println(count);
    }
}

第三题-C:不同子串

题目:

【问题描述】
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成
的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:用Set来存储不能重复对的元素,然后for循环遍历输出。

代码:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        String s = "0100110001010001";
		Set<String> set = new HashSet<String>(); // Set最大的特点就是不能存重复的元素
		for (int i = 0; i < s.length(); i++) {
			for (int j = i + 1; j <= s.length(); j++) {
				String a = s.substring(i, j);
				set.add(a);
			}
		}
		System.out.println(set.size());
    }
}

第四题-D:质数

题目:

【问题描述】
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算
第 2019 个质数是多少?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
代码:
//这个题也没什么好说的,for循环暴力破解
//那个A:的意思是对后面的for进行标记,可以break A就是直接终止A的循环
//  continue A就是跳过一次A的循环

public class zhishu {          //17569
	public static void main(String[] args) {
		int count = 0;int temp = 0;
	A:	for (int i = 2; ; i++) {
			for (int j = 2; j <i; j++) {
				if(i%j==0){
					
					continue A;
				}
			}
			count++;
			if(count==2019){
				System.out.println(i);
				break;
			}
		}
	}

}


第五题-E:最大降雨量

题目:

【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个
数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使
用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术
施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
代码:
首先要知道中位数的概念,然后将 1 ~ 49 从左往右,从上到下依次递增排列。

答案:34


第六题-F:旋转

题目:

【问题描述】
图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时
针旋转 90 度。
我们用一个 n × m 的二维数组来表示一个图片,例如下面给出一个 3 × 4 的
图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。

【输入格式】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像
素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。
【输出格式】
输出 m 行 n 列,表示旋转后的图片。

【样例输入】
3 4
1 3 5 7
9 8 7 6
3 5 9 7
【样例输出】
3 9 1
5 8 3
9 7 5
7 6 7
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n, m ≤ 10。
对于 60% 的评测用例,1 ≤ n, m ≤ 30。
对于所有评测用例,1 ≤ n, m ≤ 100。

思路:把坐标写纸上,对比前后坐标的变化;
代码:
import java.util.Scanner;
 
 
 
public class xuanzhuan {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int [][] num = new int [n+1][m+1];
		for (int i = 1; i <=n; i++) {
			for (int j = 1; j <=m; j++) {
				num[i][j]=sc.nextInt();
			}
		}
		int [][]shu = new int [m+1][n+1];
		for (int i = 1; i <=m; i++) {
			for (int j = 1; j <=n; j++) {
				shu[i][j]=num[n-j+1][i];       //关键点在这
			}
		}
		for (int i = 1; i <=m; i++) {
			for (int j = 1; j <=n; j++) {
				System.out.print(shu[i][j]+" ");
			}
			System.out.println();
		}
	}
 
}
 

第七题-G:外卖店优先级

题目:

【问题描述】
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有
一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减
到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果
优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优
先缓存中。
【输入格式】
第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6,
加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。
对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N
代码:
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int m = cin.nextInt();
        int t = cin.nextInt();
        //首先我们需要有一张关于店铺Id和时间的线性表(二维数组)
        int[][] orderShops = new int[n+1][t+1];
        //然后我们需要显示店铺的优先级
        int[] countShops = new int[n+1];
        //最后我们需要HashMap来存储缓存队列
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        for(int i =0;i<m;i++){
            int ts = cin.nextInt();
            int id = cin.nextInt();
//            if(ts <= t){
                orderShops[id][ts] ++;
//            }
        }

        for(int i =1;i <= n;i++){
            for(int j =1;j <= t;j++){
                if(orderShops[i][j]==0){    //在j时刻店铺i没有订单
                   countShops[i] = Math.max(0,countShops[i]-1);
                }else {     //有订单的时候
                    countShops[i] +=orderShops[i][j]*2; 
                }
                //每个时刻都需要自己去不断刷新,然后判断哪些在缓存对列的去留
                if(countShops[i] >5){
                    hashMap.put(i,1);
                }
                if(countShops[i] <=3 && hashMap.containsKey(i)){
                    hashMap.remove(i);
                }
            }
        }
        System.out.println(hashMap.size());
        cin.close();
    }
}


第八题-H:人物相关性分析

题目:

【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob
有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本
中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob”
和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能
有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。
第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超
过 1000000。
【输出格式】
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ K ≤ 1000000。
代码:
package action;
 
import java.util.Scanner;
 
public class demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int K = sc.nextInt();
		sc.nextLine();
		String str = sc.nextLine();
		int count = 0;
		for (int i = 0; i < str.length() - 8; i++) {
			if (str.charAt(i) == 'A') {
				String alicestr = str.substring(i, i + 5);
				if (alicestr.equals("Alice")) {
					for (int j = 0; j < K - 3; j++) {
						if (str.charAt(i + j) == 'B') {
							String bobstr = str.substring(i + j, i + j + 3);
							if (bobstr.equals("Bob")) {
								count++;
							}
						}
					}
				}
			}
			if (str.charAt(i) == 'B') {
				String bobstr = str.substring(i, i + 3);
				System.out.println(bobstr);
				if (bobstr.equals("Bob")) {
					for (int j = 0; j < K - 5; j++) {
						if (str.charAt(i + j) == 'A') {
							String alicestr = str.substring(i + j, i + j + 5);
							System.out.println(alicestr);
							if (alicestr.equals("Alice")) {
								count++;
							}
						}
					}
				}
			}
		}
		System.out.println(count);
	}
}

第九题-I:等差数列

题目:

【问题描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一
部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有
几项?
【输入格式】
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · , AN。(注意 A1 ∼ AN 并不一定是按等差数
列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2 6 4 10 20
【样例输出】
10
【样例说明】
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、
18、20。
【评测用例规模与约定】
对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 109。
代码:
package action;
 
import java.util.Arrays;
import java.util.Scanner;
 
public class demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] arr = new int[n];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = sc.nextInt();
		}
		Arrays.sort(arr);
		// 获取最小差值
		int min = arr[arr.length - 1];
		for (int i = 1; i < arr.length; i++) {
			if ((arr[i] - arr[0]) < min) {
				min = (arr[i] - arr[0]);
			}
		}
		System.out.println((arr[arr.length - 1] - arr[0]) / min + 1);
	}
}

第十题-J:扫地机器人

题目:

【问题描述】
小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所
示。
图(10-1)

走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。
已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干
净。
请你编写一个程序,计算每台机器人的清扫路线,使得
1. 它们最终都返回出发方格,
2. 每个方格区域都至少被清扫一遍,
3. 从机器人开始行动到最后一台机器人归位花费的时间最少。
注意多台机器人可以同时清扫同一方块区域,它们不会互相影响。
输出最少花费的时间。
在上图所示的例子中,最少花费时间是 6。第一台路线:2-1-2-3-4-3-2,清
扫了 1、2、3、4 号区域。第二台路线 5-6-7-6-5,清扫了 5、6、7。第三台路线
10-9-8-9-10,清扫了 8、9 和 10。
【输入格式】
第一行包含两个整数 N 和 K。
接下来 K 行,每行一个整数 Ai。
大佬的讲解视频:【https://www.bilibili.com/video/BV1z3411574j

代码:

package action;
import java.util.Arrays;
import java.util.Scanner;
 
public class demo {
	static int N,K;
	static int arr[];//存储机器人坐标
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		N=sc.nextInt();
		K=sc.nextInt();
		arr=new int[K];
		for (int i = 0; i < K; i++) {
			arr[i]=sc.nextInt();
		}
		//输入流没用了
		sc.close();
		Arrays.sort(arr);//自然排序
		int l=0,r=N,mid=0;
		while (l <= r) {
			//相当于二分查找
			mid=(r+l)>>>1;
			if(check(mid)) {
				r = mid-1;
			}else l = mid+1; 
		}
		System.out.println((mid-1)*2);
	}
	private static boolean check(int m) {
		int sum=0;//记录扫描区域
		for (int i = 0; i < K; i++) {//遍历每个机器人
			if(arr[i]-m<=sum) {
				if(arr[i]<=sum) {
					sum=arr[i]+m-1;
				}else sum+=m;
			}else return false;
		}
		return sum >= N;
	}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。