信息学奥赛初赛天天练-54-CSP-J2019阅读程序3-二叉树、满二叉树、单侧二叉树、二分查找、递归、等差数列求和

news2024/9/19 9:54:28

PDF文档公众号回复关键字:20240803

在这里插入图片描述

2019 CSP-J 阅读程序3

1阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

01 #include <iostream>
02 using namespace std;
03 const int maxn = 10000;
04 int n;
05 int a[maxn];
06 int b[maxn];
07 int f(int l, int r, int depth) {
08     if (l > r)
09         return 0;
10    int min = maxn, mink;
11    for (int i = l; i <= r; ++i) {
12         if (min > a[i]) {
13             min = a[i];
14             mink = i;
15         }
16     }
17     int lres = f(l, mink - 1, depth + 1);
18     int rres = f(mink + 1, r, depth + 1);
19     return lres + rres + depth * b[mink];
20 }
21 int main() {
22     cin >> n;
23     for (int i = 0; i < n; ++i)
24         cin >> a[i];
25     for (int i = 0; i < n; ++i)
26         cin >> b[i];
27     cout << f(0, n - 1, 1) << endl;
28     return 0;
29 }

1 如果a数组有重复的数字,则程序运行时会发生错误。( )[1.5分]

2 如果b数组全为0,则输出为0。( ) [1.5分]

3 当n=100时,最坏情况下,与第12行的比较运算执行的次数最接近的是:( ) [3分]

A 5000

B 600

C 6

D 100

4 当n=100时,最好情况下,与第12行的比较运算执行的次数最接近的是:( ) [3分]

A 100

B 6

C 5000

D 600

5 当n=10时,若b数组满足,对任意0<=i<n,都有b[i] = i + 1,那么输出最大为( ) [3分]

A 386

B 383

C 384

D 385

6 当n=100时,若b数组满足,对任意0 <= i < n,都有b[i]=1,那么输出最小为( ) [4分]

A 582

B 580

C 579

D 581

2 相关知识点

1) 二叉树

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒,例如下面是一棵二叉树

满二叉树

满二叉树又叫完美二叉树,除了叶子结点之外的每一个结点都有两个孩子,树的叶子节点均在最后一层(也就是形成了一个完美的三角形)

单侧二叉树

每1层只有左孩子或者右孩子的二叉树

2) 二分查找

二分查找也叫二分搜索 (binary search),也叫折半查找 (half-interval search),是一种在有序数组中查找特定元素的搜索算法。

所以用二分查找的前提是数组必须是有序的,可以升序也可以降序

平均时间复杂度

O(logn)

3) 递归

递归

递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决。

一个递归函数会在其定义中直接或间接地调用自身

递归通常包括两个部分:基本情况(Base case)和递归步骤(Recursive step)。

基本情况是指当问题规模变得足够小时,可以直接得到解决方案的情况。

4) 等差数列求和

等差数列求和公式

sn=(a1+an)*n/2

其中a1是第1项,an是第n项,n是总共n个数求和
例如

1+2+3+4+5+6=(1+6)*6/2=21
2+4+6+8+10=(2+10)*5/2=30

3 思路分析

大致思路

每1层找到1个最小值,把剩余数分成左右2部分(如果找到的是最小或最大,剩余的只能分成1部分)

拆分后的每部分再继续找到最小值,继续拆分

递归下去,直到最后1层,每个元素都有1个数,不能再拆分为止

示例

a和b数组

对应拆分如下

计算输出

ans=b[3]*1 +b[1]*2+b[5]*2+b[0]*3+b[2]*3+b[4]*3+b[6]*3
   =4*1    + 2*2  + 6*2  + 1*3  +3*3   + 5*3  +7*3
   =4      + 4    + 12   +  3   +9     +15    +21
   =68

1 如果a数组有重复的数字,则程序运行时会发生错误。( F )[1.5分]

分析

如下程序,通过循环比较求最小数及其下标,每次可以找到第1个最小数,不会发生错误
11    for (int i = l; i <= r; ++i) {
12         if (min > a[i]) {
13             min = a[i];
14             mink = i;
15         }
16     }

2 如果b数组全为0,则输出为0。( T ) [1.5分]

分析

由如下程序可知,返回值是下一层左边返回值+下一层右边返回值+当前层*最小值对应b数组的值
如果考虑到最后一层,左右返回值都是0,所以函数返回值取决于b数组的值
如果b数组全是0,depth*b[mink]也全是0,因此输出0
17     int lres = f(l, mink - 1, depth + 1);
18     int rres = f(mink + 1, r, depth + 1);
19     return lres + rres + depth * b[mink];

3 当n=100时,最坏情况下,与第12行的比较运算执行的次数最接近的是:( A ) [3分]

A 5000

B 600

C 6

D 100

分析

无论最小值在哪个位置,每层的比较次数是固定的,每层去除1个最小
最坏的情况是层数尽可能的多,即每次都是单侧的情况
比较次数
第1层 100
第2层 99
...
第99层 2
第100层 1
所以所有层加起来为
100+99+...+2+1 //根据等差数列求和
=(1+100)*100/2
=5050
所以比较次数最接近5000

4 当n=100时,最好情况下,与第12行的比较运算执行的次数最接近的是:( D ) [3分]

A 100

B 6

C 5000

D 600

分析

无论最小值在哪个位置,每层的比较次数是固定的,每层去除1个最小
最好的情况是层数尽可能的少,即每次都是单均分的情况
都是均分的情况,每次二分,50,25,12,6,3,2,1
log100=6~7层
比较次数
第1层 100
第2层 99
第3层 98
第4层 97
第5层 96
第6层 95
第7层 94
总的比较次数约600多次,所以选D

5 当n=10时,若b数组满足,对任意0<=i<n,都有b[i]= i + 1,那么输出最大为( D ) [3分]

A 386

B 383

C 384

D 385

分析

无论最小值在哪个位置,每层的比较次数是固定的,每层去除1个最小
由于b数组的值为1,2,3,4,5,6,7,8,9,10
由如下程序可知,需要每1层的depth*b[mink]的值
所以深度最大时,递归函数返回值最大,即每次都是单侧的情况
return lres + rres + depth * b[mink];
每次返回值为
第1层 1*1
第2层 2*2
...
第9层 9*9
第10层 10 * 10
所以输出总数
1*1+2*2+...+10*10
=1+4+9+16+25+36+49+64+81+100
=385

6 当n=100时,若b数组满足,对任意0<=i <n,都有b[i]=1,那么输出最小为( B ) [4分]

A 582

B 580

C 579

D 581

分析

b数组都为1,层数越小,输出值越小
所以每层都均分的情况,输出最小
第1层 所有里面找1个最小值,depth=1,1*1
第2层 拆分2部分,找到2个最小值 depth=2, 2*2
第3层 拆分4部分,找到4个最小值depth=3, 4*3
...
第6层 拆分32部分,找到32个最小值 32*6
第7层 最后1层,剩余节点数100-1-2-4-8-16-32=37
1*1+2*2+4*3+8*4+16*5+32*6+37*7
=1+4+12+32+80+192+259
=580

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea项目创建提交到gitee gitee创建仓库 gitee删除仓库(全网最新最详细)

一、gitee创建仓库 1.如下图 2.创建好后如下图 3.打开idea创建好项目 3.1点击终端 3.2 从gitee页面复制命令进行运行 具体步骤如下图&#xff1a; 在步骤5时可能会提醒你远程仓库没有main分支&#xff0c;这个时候需要执行下图中的命令4创建一个远程main分支 结果运行如下图…

GATK ReferenceDataSource接口介绍

在 GATK(Genome Analysis Toolkit)库中,ReferenceDataSource 接口是一个重要的接口,用于表示与参考基因组相关的数据源。它提供了一种标准化的方式来访问和操作参考基因组的不同来源的数据。ReferenceMemorySource 类和ReferenceFileSource 类是ReferenceDataSource接口的实…

给本地设备搭建一个云端语音助手

概述 本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程…

ASPCMS

1.后台修改配置文件拿Shell 步骤一&#xff1a;访问以下地址为ASPCMS...并登陆到后台&#xff08;这里注意在搭建站点的时候注意权限问题&#xff09; #网站后台 http://192.168.4.139/admin_aspcms/login.asp //全功能版本 #账户密码 username:admin password:123456 步骤二…

API网关理解

项目背景介绍&#xff1a; 首先介绍一下项目背景&#xff0c;这个项目是API开发平台&#xff0c;需要完成的接口的功能是&#xff1a;统计谁调用了这个接口&#xff0c;并且将这个接口的调用次数1&#xff0c;剩余次数-1。 首先看到这个需求第一反应&#xff1a; 得先建个表…

第三期书生大模型实战营之浦语提示词工程实践

一. 基础任务 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用LangGPT优化提示词&#…

林轩田机器学习基石——笔记1.2 Learn to Answer Yes/No(如何进行学习)

When can Mechine learn&#xff1f; 2.Learn to Answer Yes/No&#xff08;如何进行学习&#xff09; 2.1perceptron hypothesis set 2.2Perceptron Learning Algorithm 2.3Guarantee of PLA 2.4Non-Separate Data Why can Mechine learn&#xff1f; How can Mechine …

通向 AGI 之路:大型语言模型(LLM)技术精要

ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型&#xff08;LLM,Large Language Model&#xff09;效果能好成这样&#xff1b;惊醒是顿悟到我们对LLM的认知及发展理念&#xff0c;距离世界最先进的想法&#xff0c;差得有点远。我属于既惊喜又惊醒的那一批&a…

Android 12系统源码_Settings(一)认识Preference

前言 想刀一家公司的心事藏不住的&#xff0c;原本只了解一下Android系统应用Settings的配置开关列表中某个开关开启或关闭的时候&#xff0c;系统做了哪些响应操作&#xff0c;结果搞了半天发现完全看不懂。写界面就写界面吧&#xff0c;但是Settings模块完全没有使用Android…

STM32Cubemx在FreeRTOS中使用面向对象的方式使用串口

文章目录 前言一、创建FreeRTOS工程二、创建文件对串口进行封装三、代码编写总结 前言 本篇文章将带大家来学习使用面向对象的方式在FreeRTOS中使用串口&#xff0c;使用面向对象的方法非常适合编写可移植性强的代码&#xff0c;那么这篇文章就带大家来看一下这个代码要怎么写…

Evaluating the Generation Capabilities of Large Chinese Language Models

文章目录 题目摘要相关工作CG-Eval实验 题目 评估大型中文语言模型的生成能力 论文地址&#xff1a;https://arxiv.org/abs/2308.04823 项目地址&#xff1a;http://cgeval.besteasy.com/ 摘要 本文介绍了 CG-Eval&#xff0c;这是有史以来第一个全面的自动化评估框架&#xf…

《Milvus Cloud向量数据库指南》——什么是二进制嵌入?

引言 向量嵌入在现代机器学习和数据科学中已成为不可或缺的工具,它们能够将复杂数据以算法可以理解的数值格式表示。尽管密集嵌入因其能够以最小的信息损失保留语义含义而普遍存在,但随着数据量的增加,它们的计算需求和内存需求也在增加。这种增加促使开发者寻求更高效的数…

Python RPA流程自动化机器人简单案例

RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;是一种通过软件机器人模拟和执行人类用户在计算机上的操作的技术。 下面是pyautogui 键盘操作的常见参数说明&#xff1a; https://blog.csdn.net/wydyzq12/article/details/122008396 以…

TDEngine(taos) 涛思数据库-java写入数据

一、java写入taos简单案例&#xff1a; pom.xml 中加入以下依赖。 <dependency><groupId>com.taosdata.jdbc</groupId><artifactId>taos-jdbcdriver</artifactId><version>3.3.0</version> </dependency> java代码 import…

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词&#xff1a; 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN独家网络安全资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…

医疗器械网络安全 | 第三方组件安全检测怎么做?

医疗器械软件安全中的第三方组件安全检测是确保医疗器械软件整体安全性的重要环节。以下是如何进行第三方组件安全检测的详细步骤&#xff1a; 一、明确检测目标 首先&#xff0c;需要明确检测的目标和范围&#xff0c;即确定哪些第三方组件需要进行安全检测。这通常包括操作系…

C++初学(10)

10.1、共用体 共用体是一种数据格式&#xff0c;它能够存储不同的数据类型&#xff0c;但只能同时存储其中的一种类型。比如说&#xff1a;结构可以同时存储int、long、和double&#xff0c;而共用体只能存储int、long、或double。共用体的句式与结构相似&#xff0c;但含义不…

计算复杂度论文解读系列(1)《通用顺序搜索问题》---L. A. Levin

《通用顺序搜索问题》 L. A. Levin 摘要 本文研究了几种著名的“顺序搜索类型”问题&#xff0c;并证明这些问题只能在解决任何同类型问题所需的时间内得到解决。 1 简介 在阐明算法的概念之后&#xff0c;证明了许多经典问题的算法不可解性&#xff08;例如&#xff0c;群元…

【时时三省】unity test 测试框架 使用 code blocks 移植

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;使用 Code::Blocks 17.12 创建工程 2&#xff0c;移植文件至该工程下&#xff1a; 移入的文件为: 被移入的文件介绍&#xff1a; 更改代码&#xff1a; 向工程添加文…

案例:LVS负载均衡群集(NAT模式)

目录 集群 集群的含义 集群分类 类型 负载均衡集群&#xff08;Load Balance Cluster&#xff09; 高可用集群&#xff08;High Availability Cluster&#xff09; 高性能运算集群&#xff08;High Performance Computer Cluster&#xff09; 负载均衡集群架构 第一层…