蓝桥杯 第十届蓝桥杯Java语言C组

题目标签

12345
求和矩形阵列不同字串质数最大降雨量
678910
旋转外卖优先级人物相关性分析等差数列扫地机器人

1.求和

【问题描述】

小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包

括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 2019 中,所有这样的数的和是多少?

package 求和;

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

2.矩形阵列

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

package 矩形切割;

public class Main {
	public static void main(String[] args) {
		int a=2019;
		int b=324;
		int count=0;
		while (a!=b) {
			if (a>b) {
				while (a>b) {
					a-=b;	
					count++;
				}
			}
			else if(a<b){
				while (b>a) {
					b-=a;	
					count++;
				}
			}
		}
		//这里要特别注意到临界值的问题,上面的循环到a=b时就停止了计数,因为a=b时候所剩下的也是一个正方形
			count++;
		System.out.println(count);		
	}
}

3.不同字串

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

 package 不同子串;

import java.util.HashSet;

public class Main {
public static void main(String[] args) {
	String str = "0100110001010001";
	HashSet<String> set = new HashSet<String>();
	for (int i = 0; i < str.length(); i++) {
		for (int j = i+1; j <= str.length(); j++) {
			String temp = str.substring(i,j);
			System.out.println(temp);
			set.add(temp);
		}
	}
	System.out.println(set.size());
}
}

4.质数

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

package 质数;

public class Main {
public static void main(String[] args) {
	int count = 0;
	for (int i = 2; i < 100000 && count < 2019; i++) {
		if (f(i)) {
			System.out.println((++count) +"  : "+ i);
		}
	}
}

private static boolean f(int num) {
	// TODO Auto-generated method stub
	for (int i = 2; i < num; i++) {
		if (num % i == 0) {
			return false;
		}
	}
	return true;
}
}

5.最大降雨量

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

package 第十届C;

public class T5 {
	public static void main(String[] args) {
		System.out.println("34");
		//["  ","  ","  ","  ","  ","  ","  "];
		//["  ","  ","  ","  ","  ","  ","  "];
		//["  ","  ","  ","  ","  ","  ","  "];
		//["  ","  ","  ","34","35","36","37"];
		//["  ","  ","  ","38","39","40","41"];
		//["  ","  ","  ","42","43","44","45"];
		//["  ","  ","  ","46","47","48","49"];
	}
}

6.旋转

【问题描述】

图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时

针旋转 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 列,表示旋转后的图片。

试题F: 旋转 7第十届蓝桥杯大赛软件类省赛 Java 大学 C 组

【样例输入】

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。

package 旋转;

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 nums[][]=new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				nums[i][j]=sc.nextInt();
			}
		}
		for (int i = 0; i < m; i++) {
			for (int j = n-1; j >= 0; j--) {
				System.out.print(nums[j][i]);
			}
			System.out.println();
		}		
	}
	}

7.外卖优先级

【问题描述】

“饱了么”外卖系统中维护着 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

试题G: 外卖店优先级 9第十届蓝桥杯大赛软件类省赛 Java 大学 C 组

【样例输出】

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。

package 外卖优先级;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
	Scanner  sr = new Scanner(System.in);
	int n = sr.nextInt();
	int m = sr.nextInt();
	int t = sr.nextInt();
	int[] id = new int[n+1];//店号为下标
	String[] orders = new String[t+1];
	for (int i = 0; i < m; i++) {//订单列表
		int time = sr.nextInt();
		int tid = sr.nextInt();
		orders[time] += (" "+tid);
	}
	System.out.println(Arrays.toString(orders));
	//优先缓存
	ArrayList<Integer> l = new ArrayList<Integer>();
	for (int i = 1; i < orders.length; i++) {
		if (orders[i]==null) {//这时刻没有接收到任何订单
			//所有店面-1
			for (int j = 1; j < id.length; j++) {
				id[j] --;
				if(id[j] <= 0)id[j] = 0;
				if (id[j]<=3 && l.contains(j)) {//去除优先缓存
					l.remove(l.indexOf(j));
				}
			}
		}else {//接收到部分订单
			int[] check = new int[n+1];//标记是否有订单
			String[] ditel = orders[i].split(" ");
			for (int j = 1; j < ditel.length; j++) {//完成标记
				check[Integer.parseInt(ditel[j])]+=1;
			}
			//根据标记判断店面加减优先级
			for (int j = 1; j < check.length; j++) {
				if (check[j]==0) {//无订单
					id[j] --;
					if (id[j] < 0) {//最小等于零
						id[j] =0;
					}
					if (id[j]<=3 && l.contains(j)) {//去除优先缓存
						l.remove(l.indexOf(j));
					}
				}else {//有订单
					id[j]+=2 * check[j];//有几个订单就+3*n
					if (id[j]>5 && !l.contains(j)) {//加优先缓存
						l.add(j);
					}
				}
			}
		}
	};
	System.out.println(l.size());
	
	
}
}

8.人物相关性分析

【问题描述】

小明正在分析一本小说中的人物相关性。他想知道在小说中 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.

试题H: 人物相关性分析 11第十届蓝桥杯大赛软件类省赛 Java 大学 C 组

【样例输出】

2

【评测用例规模与约定】

对于所有评测用例,1 ≤ K ≤ 1000000。

package 人物相关性分析;

import java.util.Arrays;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		try {
			int K = input.nextInt();
			input.nextLine();
			String text = input.nextLine();
			//字符串分割,按照空格或.分割字符,若是(.空格)分割后为空字符串。
			String[] words = text.split("\\s|\\.");
			System.out.println(Arrays.toString(words));
			int[] wordsLength = new int[words.length];
			//将分割的字符串的长度值存储,避免三重循环中调用String.length();
			for (int i = 0; i < words.length; i++) {
				wordsLength[i] = words[i].length();
			}
			int num = 0;
			//Alice ——> Bob的距离
			for (int i = 0; i < words.length; i++) {
				if (words[i].equals("Alice")) {
					for (int j = i + 1; j < words.length; j++) {
						int sum = 1;
						if (words[j].equals("Bob")) {
							for (int k = i + 1; k < j; k++) {
								//每个单词的长度加空格占据的长度
								sum += wordsLength[k] + 1;
							}
							if (sum <= K) {
								num++;
							}
						}
					}
				}
			}
			//Bob ——> Alice的距离
			for (int i = 0; i < words.length; i++) {
				if (words[i].equals("Bob")) {
					for (int j = i + 1; j < words.length; j++) {
						int sum = 1;
						if (words[j].equals("Alice")) {
							for (int k = i + 1; k < j; k++) {
								sum += wordsLength[k] + 1;
							}
							if (sum <= K) {
								num++;
							}
						}
					}
				}
			}
			System.out.println(num);
		} catch (Exception e) {
			input.close();
		}
	}
}

9.等差数列

【问题描述】

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一

部分的数列,只记得其中 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。

试题 I: 等差数列 13第十届蓝桥杯大赛软件类省赛 Java 大学 C 组

【评测用例规模与约定】

对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 109。

package 等差数列;


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 [] num = new int [n];			//输入的数
		int [] cha = new int [n-1];			//数组排序后,相邻的数字最小的差值
		for (int i = 0; i < num.length; i++) {
			num[i]=sc.nextInt();
		}
		Arrays.sort(num);					//排序
		int min = Integer.MAX_VALUE;
		for (int i = 1; i < num.length; i++) {
			cha[i-1]=num[i]-num[0];			//相邻数字的差值  
			min=Math.min(cha[i-1], min);	//min就是相邻数字最小的差值
		}
		for (int i = min; i >= 1; i--) {
			int k = cha[0] % i;
			if (f(i, cha, k)) {
				int temp=0;							//统计最短等差数列的个数
				for (int p = num[0]; p <= num[n-1]; p+=i) {	//i+=min   按照等差值进行上升,直到从最小的数到最大的数
					System.out.print(p+" ");
					temp++;
				}
				System.out.println(temp);
				return;
			}
		}
		
		 
	}

	private static boolean f(int d, int[] cha, int k) {
		for (int i = 0; i < cha.length; i++) {
			if (cha[i] % d != k) {
				return false;
			}
		}
		return true;
	}
}

10.扫地机器人

【问题描述】

小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所

示。

走廊内部署了 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。

试题 J: 扫地机器人 15第十届蓝桥杯大赛软件类省赛 Java 大学 C 组

【输出格式】

输出一个整数表示答案。

【样例输入】

10 3

5

2

10

【样例输出】

6

【评测用例规模与约定】

对于 30% 的评测用例,1 ≤ K < N ≤ 10。

对于 60% 的评测用例,1 ≤ K < N ≤ 1000。

对于所有评测用例,1 ≤ K < N ≤ 100000,1 ≤ Ai ≤ N。

参考->  蓝桥杯2019试题J扫地机器人

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小传传

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值