第十三届蓝桥杯模拟赛第二期

A.填空题

问题描述

小蓝的IP地址为 192.168.*.21,其中 * 是一个数字,请问这个数字最大可能是多少?

答案提交

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

参考答案

255

B.填空题

问题描述

如果一个整数 g 能同时整除整数 A  和 B,则称 g  是 A 和 B 的公约数。例如:43是 86 和 2021 的公约数。
请问在 1(含) 到 2021(含) 中,有多少个数与 2021存在大于 1  的公约数。请注意 2021 和 2021 有大于 1的公约数,因此在计算的时候要算一个。

答案提交

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

参考答案

89

public class Main {
    public static void main(String[] args) {
    	int ans=0;
    	int g=0;
    	for(int i=1;i<=2021;i++) {
    		g=gcd(2021,i);
    		if(g>1) {
    			ans++;
    		}
    	}
    	System.out.println(ans);
    }
    public static int gcd(int a,int b) {
    	if(b==0) {
    		return a;
    	}
    	return gcd(b,a%b);
    }
}

C填空题

问题描述

2021是一个非常特殊的数,它可以表示成两个非负整数的平方差,2021 = 45 ∗ 45 − 2 ∗ 2 。
2025 20252025 也是同样特殊的数,它可以表示成 2025 = 45 ∗ 45 − 0 ∗ 0 
请问,在 1 到 2021 中有多少个这样的数?
请注意,有的数有多种表示方法,例如 9 = 3 ∗ 3 − 0 ∗ 0 = 5 ∗ 5 − 4 ∗ 4 ,在算答案时只算一次。

答案提交

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

参考答案

1516

import java.util.*;
public class Main {
	public static void main(String[] args) {
    	int ans=0;
    	for(int i=1;i<=2021;i++) {
    		if(check(i)) {
    			ans++;
    		}
    	}
    	System.out.println(ans);
    }
    public static boolean check(int n) {
    	for(int i=0;i<9999;i++) {
    		for(int j=i;j<9999;j++) {
    			if(j*j-i*i==n) {
    				return true;
    			}
    		}
    	}
    	return false;
    }
}

D填空题

问题描述

小蓝要用01串来表达一段文字,这段文字包含 a, b, c, d, e, f共 6个字母,每个字母出现的次数依次为:a 出现 10次,b出现 20次,c出现 3次,d出现 4次,e出现 18次,f出现 50次。
小蓝准备分别对每个字母使用确定的01串来表示,不同字母的01串长度可以不相同。
在表示文字时,将每个字母对应的01串直接连接起来组成最终的01串。为了能够正常还原出文字,小蓝的编码必须是前缀码,即任何一个字符对应的01串都不能是另一个字符对应的01串的前缀。
例如,以下是一个有效的编码:

a: 000
b: 111
c: 01
d: 001
e: 110
f: 100

其中 c 的长度为 2,其它字母的编码长度为 3,这种方式表示这段文字需要的总长度为:10 ∗ 3 + 20 ∗ 3 + 3 ∗ 2 + 4 ∗ 3 + 18 ∗ 3 + 50 ∗ 3 = 312 
上面的编码显然不是最优的,将上面的 f的编码改为 10,仍然满足条件,但是总长度为 262,要短 50。
要想编码后的总长度尽量小,应当让出现次数多的字符对应的编码短,出现次数少的字符对应的编码长。
请问,在最优情况下,编码后的总长度最少是多少?

参考答案

219

//哈夫曼树

第十三届蓝桥杯模拟赛第二期_第1张图片

public class Main {
	public static void main(String[] args) {
    	//f:50 b:20 e:18 a:10 d:4 c:3
		int n=50*1+20*2+18*3+10*4+4*5+3*5;
		System.out.println(n);
    }
}

E填空题

问题描述

下面的矩阵中包含 ABCDEF六种字符,请问出现最多的字符出现了几次?

FFEEFEAAECFFBDBFBCDA
DACDEEDCCFFAFADEFBBA
FDCDDCDBFEFCEDDBFDBE
EFCAAEECEECDCDECADDC
DFAEACECFEADCBFECADF
DFBAAADCFAFFCEADFDDA
EAFAFFDEFECEDEEEDFBD
BFDDFFBCFACECEDCAFAF
EFAFCDBDCCBCCEADADAE
BAFBACACBFCBABFDAFBE
FCFDCFBCEDCEAFBCDBDD
BDEFCAAAACCFFCBBAAEE
CFEFCFDEEDCACDACECFF
BAAAFACDBFFAEFFCCCDB
FADDDBEBCBEEDDECFAFF
CDEAFBCBBCBAEDFDBEBB
BBABBFDECBCEFAABCBCF
FBDBACCFFABEAEBEACBB
DCBCCFADDCACFDEDECCC
BFAFCBFECAACAFBCFBAF

答案提交

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

参考答案

78

import java.util.*;
public class Main {
	public static void main(String[] args) {
    	Scanner scan=new Scanner(System.in);
    	int max=Integer.MIN_VALUE;
    	char[][] ch=new char[20][20];
    	int[] a=new int[26];
    	for(int i=0;i<20;i++) {
    		String str=scan.next();
    		for(int j=0;j<20;j++) {
    			ch[i][j]=str.charAt(j);
    		}
    	}
    	for(int i=0;i<20;i++) {
    		for(int j=0;j<20;j++) {
    			int b=ch[i][j]-'A';
    			a[b]++;
    		}
    	}
    	for(int i=0;i<26;i++) {
    		max=Math.max(max, a[i]);
    	}
    	System.out.println(max);
    }
}

F编程题

问题描述

小蓝要到店里买铅笔。
铅笔必须一整盒一整盒买,一整盒 12 支,价格 p 元。
小蓝至少要买 t 支铅笔,请问他最少花多少钱?

输入格式

输入一行包含两个整数 p、t,用一个空格分隔。

输出格式

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

样例输入

5 30

样例输出

15

样例说明

小蓝至少要买3盒才能保证买到30支铅笔,总共花费 15 元。

评测用例规模与约定

对于所有评测用例,1 <= p <= 100,1 <= t <= 10000。

import java.util.*;
public class Main {
    public static void main(String[] args) {
    	int money=0;
    	Scanner scan=new Scanner(System.in);
    	int p=scan.nextInt();
    	int t=scan.nextInt();
    	for(int i=12;;i=i+12) {
    		money+=p;
    		if(i>=t) {
    			System.out.println(money);
    			break;
    		}
    	}
    }
}

G编程题

问题描述

给定一个三角形的三条边的长度 a, b, c,请问这个三角形是不是一个直角三角形。

输入格式

输入一行包含三个整数 a, b, c,表示三角形三边的长度,相邻整数之间用一个空格分隔。

输出格式

如果是直角三角形,输出“YES”(全大写),否则输出“NO”(全大写)。

样例输入

345

样例输出

YES

样例输入

4 5 4

样例输出

NO

评测用例规模与约定

对于所有评测用例,1 <= a, b, c <= 1000。

import java.util.*;
public class Main {
    public static void main(String[] args) {
    	Scanner scan=new Scanner(System.in);
    	int[] a=new int[3];
    	for(int i=0;i<3;i++) {
    		a[i]=scan.nextInt();
    	}
    	Arrays.sort(a);
    	if(a[0]*a[0]+a[1]*a[1]==a[2]*a[2]) {
    		System.out.println("YES");
    	}
    	else {
    		System.out.println("NO");
    	}
    }
}

H编程题

问题描述

n 个小朋友正在做一个游戏,每个人要分享一个自己的小秘密。
  每个小朋友都有一个 1 到 n 的编号,编号不重复。
  为了让这个游戏更有趣,老师给每个小朋友发了一张卡片,上面有一个 1 到 n 的数字,每个数字正好出现一次。
  每个小朋友都将自己的秘密写在纸上,然后根据老师发的卡片上的数字将秘密传递给对应编号的小朋友。如果老师发给自己的数字正好是自己的编号,这个秘密就留在自己手里。
  小朋友们拿到其他人的秘密后会记下这个秘密,老师会再指挥所有小朋友将手中的秘密继续传递,仍然根据老师发的卡片上的数字将秘密传递给对应编号的小朋友。
  这样不断重复 n 次。
  现在,每个小朋友都记下了很多个秘密。
  老师现在想找一些小朋友,能说出所有秘密,请问老师最少要找几个小朋友?

输入格式

输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,分别表示编号 1 到 n 的小朋友收到的数字。

输出格式

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

样例输入

6
2 1 3 5 6 4
1
2

样例输出

3
1

样例说明

最终小朋友 1, 2互相知道了对方的秘密,小朋友3 只知道自己的秘密,小朋友 4, 5, 6 互相知道了对方的秘密。
至少要找 3 个小朋友才能说出所有秘密。

评测用例规模与约定

对于 30 % 30\%30% 的评测用例,2 < = n < = 30 2 <= n <= 302<=n<=30。
对于 60 % 60\%60% 的评测用例,2 < = n < = 1000 2 <= n <= 10002<=n<=1000。
对于所有评测用例,2 < = n < = 100000 2 <= n <= 1000002<=n<=100000。

I编程题

问题描述

一个 1到 n 的排列被称为半递增序列,是指排列中的奇数位置上的值单调递增,偶数位置上的值也单调递增。
例如:(1, 2, 4, 3, 5, 7, 6, 8, 9) 是一个半递增序列,因为它的奇数位置上的值是 1, 4, 5, 6, 9,单调递增,偶数位置上的值是 2, 3, 7, 8,也是单调递增。
请问,1 到 n 的排列中有多少个半递增序列?

输入格式

输入一行包含一个正整数 n。

输出格式

输出一行包含一个整数,表示答案,答案可能很大,请输出答案除以 1000000007 的余数。

样例输入

5
1

样例输出

10
1

样例说明

有以下半递增序列:

1:(1, 2, 3, 4, 5)
2:(1, 2, 3, 5, 4)
3:(1, 2, 4, 3, 5)
4:(1, 3, 2, 4, 5)
5:(1, 3, 2, 5, 4)
6:(1, 4, 2, 5, 3)
7:(2, 1, 3, 4, 5)
8:(2, 1, 3, 5, 4)
9:(2, 1, 4, 3, 5)
10:(3, 1, 4, 2, 5)

评测用例规模与约定

对于50 % 50\%50% 的评测用例,2 < = n < = 20 2 <= n <= 202<=n<=20。
对于所有评测用例,2 < = n < = 1000 2 <= n <= 10002<=n<=1000。

import java.util.*;
public class Main {
	static Scanner scan=new Scanner(System.in);
	static int n=scan.nextInt();
	static int count=0;
	static int biaoji[]=new int[n+1];
	static int a[]=new int[n];
	static int ans[]=new int[n];
    public static void main(String[] args) {
    	int mod=1000000007;
    	dfs(0);
    	System.out.println(count%mod);
    }
    public static void dfs(int x) {
    	if(x==n) {
    		for(int i=0;ia[i+2]) {
    				return false;
    			}
    		}
    		for(int i=1;i<=n-5;i=i+2) {
    			if(ans[i]>a[i+2]) {
    				return false;
    			}
    		}
    	}
    	if(ans.length%2!=0) {
    		for(int i=0;i<=n-3;i=i+2) {
    			if(a[i+2]

J编程题

问题描述

小蓝住在 LQ 城,今天他要去小乔家玩。
LQ 城可以看成是一个 n 行 m 列的一个方格图。
小蓝家住在第 1 行第 1 列,小乔家住在第 n 行第 m 列。
小蓝可以在方格图内走,他不愿意走到方格图外。
城市中有的地方是风景优美的公园,有的地方是熙熙攘攘的街道。小蓝很喜欢公园,不喜欢街道。他把方格图中的每一格都标注了一个属性,或者是喜欢的公园,标为1,或者是不喜欢的街道标为2。小蓝和小乔住的地方都标为了1。
小蓝每次只能从一个方格走到同一行或同一列的相邻方格。他想找到一条路径,使得不连续走两次标为 2 的街道,请问在此前提下他最少要经过几次街道?

输入格式

输入的第一行包含两个整数 n, m,用一个空格分隔。
接下来 n 行,每行一个长度为 m 第数字串,表示城市的标注。

输出格式

输出一行包含一个整数,表示答案。如果没有满足条件的方案,输出 -1。

样例输入

3 4
1121
1211
2211

样例输出

1

样例输入

3 4
1122
1221
2211

样例输出

-1

样例输入

5 6
112121
122221
221212
211122
111121

样例输出

5

评测用例规模与约定

对于 50% 的评测用例,2 <= n, m <= 20。
对于所有评测用例,2 <= n, m <= 300。

import java.util.*;
public class Main {
	static Scanner scan=new Scanner(System.in);
	static int n=scan.nextInt();
	static int m=scan.nextInt();
	static int count=0;
	static int min=Integer.MAX_VALUE;
	static int a[][]=new int[n][m];
	static int biaoji[][]=new int[n][m];
	static int nx[]=new int[] {-1,0,0,1};
	static int ny[]=new int[] {0,-1,1,0};
    public static void main(String[] args) {
    	for(int i=0;i=0&&xx=0&&yy

你可能感兴趣的:(蓝桥杯,算法,职场和发展)