2020年第十二届蓝桥杯第一场校模拟赛


以下均为个人想法和解题思路,如有错误或不足,欢迎指正。


试题 A

本题总分:5 分

  • 【问题描述】

如果整数 a 是整数 b 的整数倍,则称 b 是 a 的约数。
请问,有多少个正整数是 2020 的约数。

  • 【答案提交】

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

个人答案:12

个人代码:


public class _12_XX1_B_试题A {
	
	public static void main(String[] args) {
		int res = 0;
		for(int i=1; i<=2020; ++i) 
			if(2020%i==0) ++res;
		System.out.println(res);
	}

}

解题思路:


试题 B

本题总分:5 分

  • 【问题描述】

如果一个 mp3 文件占用磁盘的大小是 4MB,小蓝的硬盘还剩下 100GB 的空间,请问他还可以放多少个这样的 mp3 文件?

  • 【答案提交】

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

个人答案:25600

个人代码:


public class _12_XX1_B_试题B {
	
	public static void main(String[] args) {
		System.out.println(100*1024/4);
	}

}

解题思路:


试题 C

本题总分:10 分

  • 【问题描述】

一个包含 2020 个结点的无向图,如果图中没有自环和重边,最多包含多少条边?

  • 【答案提交】

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

个人答案:2039190

个人代码:


public class _12_XX1_B_试题C{
	
	public static void main(String[] args) {
		System.out.println(2019*2020/2);
	}
	
}

解题思路:第一个结点能与剩余2019个结点连2019条边,第二个结点能与剩余2018个结点连2018条边,第三个结点能与剩余2017个结点连2017条边,…,因此结果为(2019+2018+2017+…+2+1)= 2019*(2019+1)/2 = 2019*2020/2


试题 D

本题总分:10 分

  • 【问题描述】

整数 1 到 6 连在一起,成为 123456,长度为 6。
整数 1 到 12 连在一起,成为 123456789101112,长度为 15。
请问整数 1 到 2020 连在一起,长度为多少?

  • 【答案提交】

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

个人答案:6973

个人代码:


public class _12_XX1_B_试题D {
	
	public static void main(String[] args) {
		int res = 0;
		for(int i=1; i<=2020; ++i) 
			res += new String(i+"").length();
		System.out.println(res);
	}

}


解题思路:


试题 E

本题总分:15 分

  • 【问题描述】

在一个序列 a = (a[1], a[2], …, a[n]) 中,如果 (i, j) 满足 i < j 且 a[i] > a[j],则称为一个逆序对。
例如:(3, 2, 2, 1) 中包含 6 个逆序对。(注:题目是网上拿的,不能保证其正确性,这里的6个逆序对应该是不正确的,应该为5个)
请问,(87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15) 中包含多少个逆序对?

  • 【答案提交】

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

个人答案:217

个人代码:


public class _12_XX1_B_试题E {
	
	public static void main(String[] args) {
		int[] r = new int[] {87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13, 2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15};
		int res = 0;
		for(int i=0; i<r.length; ++i)
			for(int j=i+1; j<r.length; ++j)
				if(r[i]>r[j]) ++res;
		System.out.println(res);
	}

}

解题思路:


试题 F

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

  • 【问题描述】

给定一个三角形的底边长度 l 和高度 h,求三角形的面积。

  • 【输入格式】

输入的第一行包含一个整数 l,表示三角形的底边长度。
第二行包含一个整数 h,表示三角形的高。

  • 【输出格式】

输出一个数,表示三角形的面积。如果面积为整数,请直接输出这个整数,不带小数点。如果面积不是整数,请四舍五入保留正好一位小数。

  • 【样例输入】

5
6

  • 【样例输出】

15

  • 【样例输入】

5
3

  • 【样例输出】

7.5

  • 【评测用例规模与约定】

对于所有评测用例,1 <= l, h <= 100。

个人代码:


import java.util.Scanner;

public class _12_XX1_B_试题F {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double res = sc.nextInt()*sc.nextInt()/2.0;
		System.out.println(res == (int)(res) ? (int)res : String.format("%.1f", res));
	}

}

解题思路:


试题 G

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

  • 【问题描述】

小蓝正在上小学,老师要求同学们在暑假每天记日记。
可是小蓝整个暑假都在玩,直到最后一天才想起要记日记。于是小蓝赶紧编了一些日记交给老师。
没想到,日记很快就被老师发现了问题,原来小蓝记完8月31日的日记,竟又记了8月32日和8月33日的日记。
这显然是有问题的,因为根本没有8月32日和8月33日。
给定一个月份和一个日期,请问2021年有没有这一天。

  • 【输入格式】

输入的第一行包含一个整数 m,表示月份。
第二行包含一个整数 d,表示日期。

  • 【输出格式】

如果2021年有 m 月 d 日,输入 yes,否则输出 no。

  • 【样例输入】

8
32

  • 【样例输出】

no

  • 【样例输入】

2
28

  • 【样例输出】

yes

  • 【评测用例规模与约定】

对于所有评测用例,1 <= m <= 20,1 <= d <= 40。

个人代码:


import java.util.Scanner;

public class _12_XX1_B_试题G {
	static int[] r = new int[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	
	public static void main(String[] args) {
		if(2021%4==0 && 2021%100!=0 || 2021%400==0) ++r[2];			
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt(), d = sc.nextInt();
		if(r[m]>=d)
			System.out.println("yes");
		else
			System.out.println("no");
	}

}

解题思路:


试题 H

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

  • 【问题描述】

给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?

  • 【输入格式】

输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。

  • 【输出格式】

输出一个单词,表示答案

  • 【样例输入】

LANQIAO
3

  • 【样例输出】

AIAO

  • 【评测用例规模与约定】

对于所有评测用例,单词长度不超过 100,t 小于单词长度。

个人代码:


import java.util.Scanner;

public class _12_XX1_B_试题H {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		char[] ch = sc.next().toCharArray();
		int t = sc.nextInt(), n = ch.length-t, si = -1;
		for(int i=n; i>0; --i) {
			++si;
			char ct = 'Z';
			for(int j=si; j<ch.length-i+1; ++j) {
				if(ch[j] < ct) {
					si = j;
					ct = ch[j];
				}
			}
			System.out.print(ch[si]);
		}
	}
}

解题思路:


试题 I

时间限制: 3.0s 内存限制: 512.0MB 本题总分:25 分

  • 【问题描述】

给定一个序列 a_1, a_2, …, a_n。其中 a_1 < a_2 < … < a_n。
相邻两个数之间的差(后一个数减前一个数)称为它们的间隙。
请问序列中最大的间隙值是多少?

  • 【输入格式】

输入的第一行包含一个整数 n,表示序列的长度。
第二行包含 n 个正整数,为给定的序列。

  • 【输出格式】

输出一个整数,表示序列中最大的间隙值。

  • 【样例输入】

5
1 3 8 9 12

  • 【样例输出】

5

  • 【评测用例规模与约定】

对于所有评测用例,1 <= n <= 1000,1 <= a_i <= 100000。

个人代码:


import java.util.Scanner;

public class _12_XX1_B_试题I {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a = sc.nextInt(), b, res = 0;
		for(int i=1; i<n; ++i) {
			b = sc.nextInt();
			res = Math.max(res, b-a);
			a = b;
		}
		System.out.println(res);
	}

}

解题思路:


试题 J

时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分

  • 【问题描述】

小蓝有黄绿蓝三种颜色的小球,分别为 R, G, B 个。同样颜色的小球没有区别。
小蓝将这些小球从左到右排成一排,排完后,将最左边的连续同色小球个数记为 t_1,将接下来的连续小球个数记为 t_2,以此类推直到最右边的小球。
请问,总共有多少总摆放小球的方案,使得 t_1, t_2, … 为严格单调递增序列,即 t_1 < t_2 < t_3 < …

  • 【输入格式】

输入一行包含三个整数 R, G, B。

  • 【输出格式】

输出一个整数,表示答案。

  • 【样例输入】

3 6 0

  • 【样例输出】

3

  • 【样例说明】

用 r 表示红球,g 表示绿球,可能的方案包括:
rrrgggggg
grrrggggg
ggrrrgggg

  • 【样例输入】

2 4 6

  • 【样例输出】

3

  • 【样例说明】

用 r 表示红球,g 表示绿球,b 表示蓝球,可能的方案包括:
rrggggbbbbbb
grrgggbbbbbb
brrggggbbbbb

  • 【评测用例规模与约定】

对于30%的评测用例,1 <= R, G, B <= 10;
对于60%的评测用例,1 <= R, G, B <= 30;
对于所有评测用例,1 <= R, G, B <= 50。
  
个人代码:


import java.util.Scanner;

public class _12_XX1_B_试题J {
	static int[] r = new int[3];	//用r[0]、r[1]、r[2]分别存放R、G、B的数量(R对应0,G对应1,B对应2)
	static int total, res = 0;		//total记录RGB的总共数量

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		for(int i=0; i<r.length; ++i)
			r[i] = sc.nextInt();
		total = r[0]+r[1]+r[2];
		dfs(total, 0, -1);	//模拟全排列
		System.out.println(res);
	}

	public static void dfs(int sum, int x, int last) {	//sum表示RGB总共还有多少个没有被使用,x表示上一种颜色放了多少个,last表示上一种颜色(-1表示非RGB)
		if(sum == 0) {
			++res;
			return ;
		}
		for(int i=0; i<3; ++i) {			//依次遍历0、1、2(表示R、G、B)
			if(i == last) continue;			//如果上一种颜色和当前遍历的颜色相同,则不对当前颜色进行模拟
			for(int j=x+1; j<=r[i]; ++j) {		//模拟当前颜色可以排放的数量(最少为x+1,表示起码比上一种颜色多放一个;最多为r[i],即当前剩余的个数)
				r[i] -= j;
				if(sum>=j)dfs(sum - j, j, i);
				r[i] += j;
			}
		}
	}

}


/**
 * 上面那种虽然没有剪枝,但比较省事且不容易出错不容易漏细节
 * 这种在效率上有所提升,但需要细心注意细节
 */
import java.util.Scanner;

public class Main {
	static int[] r = new int[3];
	static int total, res = 0;

	public static void main(String[] args) throws InterruptedException {
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < r.length; ++i)
			r[i] = sc.nextInt();
		total = r[0] + r[1] + r[2];
		dfs(total, 0, -1);
		System.out.println(res);
	}

	public static void dfs(int sum, int x, int last) throws InterruptedException {
		if (sum == 0) {
			++res;
			return;
		}

		// 听取一位的读者的改进,对搜索进行剪枝,本层搜索只搜到剩余球数中最小且不与上一层颜色相同的数量
		int min = Integer.MAX_VALUE;
		for (int i = 0; i < r.length; ++i)
			if (r[i] != 0 && i != last)		//注意 i != last 这个条件不能少
				min = Math.min(min, r[i]);
		if (min == Integer.MAX_VALUE)	//注意这个检查也不能少
			return;

		for (int i = 0; i < 3; ++i) {
			if (i == last)
				continue;
			for (int j = x + 1; j <= r[i] && j <= min; ++j) {	//注意这里仍然不能少了 j <= r[i]
				r[i] -= j;
				if (sum >= j)
					dfs(sum - j, j, i);
				r[i] += j;
			}
		}
	}

}


  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值