蓝桥杯-2021模拟赛第四场(部分)

试题C——答案:4042

【问题描述】
有一棵二叉树,有2021个叶结点。
  请问。这棵树至少有多少个结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

二叉树结点的求解

【答案】:4042

【解析】:

非空二叉树上的叶子结点数(度为0的节点,称为“叶子结点”)等于度为2的结点数加1,即n0=n2+1 。

设度为0、1、2的结点个数分别为n0、n1、n2,二叉树的节点总数n=n0+n1+n2 。

二叉树的总结点个数为:n=n0+n1+n2=n0+n1+(n0-1)

度为2的结点数 n2 = n0 - 1 = 2021 - 1 = 2020

叶子节点的数目为2021个(奇数),所以肯定存在度为1的节点,即 n1 = 1

所以,二叉树的总结点个数至少为:
n=n0+n1+n2=n0+n1+(n0-1)=2021+1+2020=4042

试题D——答案:25

问题描述
  Fibonacci序列按照如下公式定义:
  F[1] = 1
  F[2] = 1
  F[i] = F[i-1] + F[i-2] (i>2)
  前几个 Fibonacci 数为 1, 1, 2, 3, 5, 8, 13, 21。
  请问,前100个 Fibonacci 数中,有多少个数是 3 的倍数?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

找规律
多写几个找规律:1、1、2、3、5、8、13、21、34、55、89、144 …
会发现每4个数中,会出现一个3的倍数。所以,前100个数中,3的倍数有:100÷4=25个。

代码实现python

f=[1,1]   //列表
for i in range(2,100):
    f.append(f[i-1]+f[i-2])
ans=0
for i in range(100):
    if f[i]%3==0:
        ans+=1
print(ans)

代码实现java
遍历Fibonacci序列——Fibonacci序列的第100项数据,会爆“int型数组、long型数组”,所以要使用BigInteger数组。

import java.math.BigInteger;
 
public class Fibonacci {
 
	public static void main(String[] args) {
//		test1();
//		test2();
		test3();
	}
 
	public static void test1() { //测试:fib[100]爆int数组
		int fib[] = new int[105];
		fib[0] = 0;
		fib[1] = fib[2] = 1;
		for (int i = 3; i <= 102; i++) {
			fib[i] = fib[i - 1] + fib[i - 2];
		}
		int answer = 0;
		for (int i = 1; i <= 100; i++) {
			if (fib[i] % 3 == 0) {
				answer++;
			}
		}
		System.out.println(answer);
	}
 
	public static void test2() { //测试:fib[100]爆long数组
		long fib[] = new long[102];
		fib[0] = 0;
		fib[1] = fib[2] = 1;
		for (int i = 3; i < 102; i++) {
			fib[i] = fib[i - 1] + fib[i - 2];
			System.out.println(i + ":" + fib[i]);
		}
		int answer = 0;
		for (int i = 1; i <= 100; i++) {
			if (fib[i] % 3 == 0) {
				answer++;
			}
		}
		System.out.println(answer);
	}
 
	public static void test3() {
		BigInteger arr[] = new BigInteger[2025]; // int型与long型数据均会爆数组
		arr[0] = BigInteger.ZERO;
		arr[1] = arr[2] = BigInteger.ONE;
		for (int i = 3; i <= 2020; i++) {
			arr[i] = arr[i - 1].add(arr[i - 2]);
		}
		int answer = 0;
		BigInteger three = new BigInteger("3");
		for (int i = 1; i <= 100; i++) { 
			
			if (arr[i].mod(three).equals(arr[0])) {
				answer++;
//				
			}
		}
		System.out.println(answer);
	}
}

试题F

问题描述
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。他发现孩子们对于摩尔斯电码非常感兴趣。
摩尔斯电码由两种基本的信号组成:短信号"滴"(用字符’.‘表示)以及长信号"嗒"(用字符’-'表示)。下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:
.---- …— …-- …- … -… --… —… ----. -----
1 2 3 4 5 6 7 8 9 0
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:
…— ----- …— .---- ----- .---- ----- .----
你能写一个程序帮助小Hi吗?

输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N <= 100)
以下N行每行一个由0-9组成的字符串,代表一个生日日期。(日期格式:yyyymmdd,日期范围: 20000101至20210101)

输出格式
对于每个生日日期,输出一行表示转化后的摩尔斯码,数字之间用一个空格隔开。

样例输入
2
20161011
20000101

样例输出
…— ----- .---- -… .---- ----- .---- .----
…— ----- ----- ----- ----- .---- ----- .----

import java.util.Scanner;

public class F4 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); // 1 <= N <= 100
		String str[] = { "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----." }; // 0对应的字符串在开头
		String[] strs=new String[N];
		for (int i = 0; i < N; i++){
			String s = sc.next();
			strs[i]=s;
		}
		for (int i = 0; i < N; i++) { // 由0-9组成的字符串,日期范围:20000101至20210101
			
			char strArray[] = strs[i].toCharArray();
			for (int j = 0; j < 8; j++) { // [0, 8] 遍历字符数组,取出每一个字符
				int index = (int) (strArray[j] - '0'); // 字符串数组的下标
				if (j == 7) { // 若是输出最后的字符串,则末尾不加空格
					System.out.print(str[index]);
				} else {
					System.out.print(str[index] + " ");
				}
			}
			System.out.println();
		}
	}
}

试题H

问题描述
  给定一个序列 (a_1, a_2, …, a_n), 定义序列中的一个递增三元组是指三个下标 i, j, k 对应的三个元素 a_i, a_j, a_k,这三个元素满足 a_i < a_j < a_k。
  例如序列 (1, 1, 4, 3, 2, 4) 有以下 4 个递增三元组:
  1. 下标 1, 4, 6 对应的 1, 3, 4;
  2. 下标 1, 5, 6 对应的 1, 2, 4;
  3. 下标 2, 4, 6 对应的 1, 3, 4;
  4. 下标 2, 5, 6 对应的 1, 2, 4。
  注意,可能有下标不同,但对应数值相同的三元组,他们应当算成不同的三元组。
  给定序列,请问序列中一共有多少个不同的递增三元组。

输入格式
  输入第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个整数 a_1, a_2, …, a_n,表示给定的序列。
输出格式
  输出一行,包含一个整数,表示序列中的递增三元组数量。请注意答案可能很大,可能超过 32 位二进制整数的范围,建议使用 64 位二进制整数。

样例输入
6
1 1 4 3 2 4

样例输出
4

数据规模和约定
  对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 10。
  对于 50% 的评测用例,1 <= n <= 1000, 0 <= a_i <= 100。
  对于 80% 的评测用例,1 <= n <= 10000, 0 <= a_i <= 100。
  对于所有评测用例,1 <= n <= 100000, 0 <= a_i <= 100。

import java.util.Scanner;
 
public class Sanyuanzu {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int array[] = new int[n];
		for (int i = 0; i < n; i++) {
			array[i] = sc.nextInt();
		}
		Long answer = 0L; // 答案可能很大,建议使用64位二进制整数
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				for (int k = j + 1; k < n; k++) {
					if (array[i] < array[j] && array[j] < array[k]) {
						answer++;
					}
				}
			}
		}
		System.out.println(answer);
	}
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值