信息学奥赛初赛天天练-29-CSP-J2022阅读程序-掌握递归、递推、动态规划、二分与极值函数应用

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

在这里插入图片描述

2022 CSP-J 阅读程序2

阅读程序(判断题1.5分 选择题3分 共计40分 )

01 #include <algorithm>
02 #include <iostream>
03 #include <limits>
04 
05 using namespace std;
06 
07 const int MAXN = 105;
08 const int MAXK = 105;
09 
10 int h[MAXN][MAXK];
11 
12 int f(int n, int m)
13 {
14     if(m == 1) return n;
15     if(n == 0) return 0;
16     
17     int ret = numeric_limits<int>::max();
18     for(int i=1; i<=n;i++)
19         ret = min(ret,max(f(n-i,m),f(i-1,m-1)+1));
20     return ret;
21 }
22 
23 int g(int n,int m)
24 {
25     for(int i=1;i<=n;i++)
26         h[i][1]=i;
27     for(int j=1;j<=m;j++)
28         h[0][j]=0;
29         
30     for(int i=1;i<=n;i++){
31         for(int j=2;j<=m;j++){
32             h[i][j]=numeric_limits<int>::max();
33             for(int k=1;k<=i;k++)
34             h[i][j]=min(
35                 h[i][j],
36                 max(h[i-k][j],h[k-1][j-1])+1);
37         }
38     }
39     
40     return h[n][m];
41 }    
42 
43 int main()
44 {
45     int n,m;
46     cin>>n>>m;
47     cout<<f(n,m)<<endl<<g(n,m)<<endl;
48     return 0;
49 }

假设输入的n、m均时不超过100的正整数,完成下面的判断题和选择题

判断题

22.当输入为"7 3"时,第19行用来取最小值的min函数执行了449次( )

23.输出的两行整数总是相同的( )

24.当m为1时,输出的第一行总为n( )

单选题

25.算法g(n,m)最为准确的时间复杂度分析结果为( )

A. O( n 3 / 2 m n^{3/2}m n3/2m)

B. O(nm)

C. O( n 2 m n^2m n2m)

D. O( n m 2 nm^2 nm2)

26.当输入为"20 2"时,输出的第一行为( )

A. “4”

B. “5”

C. “6”

D. “20”

27.(4分)当输入为"100 100"时,输出的第一行为( )

A. “6”

B. “7”

C. “8”

D. “9”

2 相关知识点

1) 整数最大值

一般来说,数值类型的极值是一个与平台相关的特性。C++标准程序库通过template numeric_limits提供这些极值,取代传统C语言所采用的预处理常数

#include<bits/stdc++.h>
using namespace std;
/*
  c++提供了一些求极值的函数
  整数最大值 numeric_limits max min
 */
int main(){
	 
	int max_int = numeric_limits<int>::max();//int类型的最大值 
	cout<<max_int<<endl;//2147483647
	int min_int = numeric_limits<int>::min();//int类型的最小值 
	cout<<min_int<<endl;//-2147483648
	
	long long max_long = numeric_limits<long long>::max();//long long 类型的最大值 
	cout<<max_long<<endl;//9223372036854775807
	
	return 0;
}

2) 递归(Recursion)

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

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

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

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

3) 递推(Recurrence)

递推是一种描述序列中项与项之间关系的方法。递推关系通常用于定义具有某种规律性的数列,如斐波那契数列

递推关系可以用一个公式或方程来表示,该公式或方程描述了序列中的每一项如何由前一项(或前几项)计算得出

4) 递归和递推区别

递归是一种解决问题的方法,通过将问题分解为更小的子问题来解决,自上而下分解,通常会出现多次重复计算问题

递推是一种描述序列中项与项之间关系的方法,自底而上计算,避免重复计算

通过斐波那契数列演示区别

递归f(3)重复计算3次,如果数更大重复更多

递推计算是从最底层计算,计算上一层时使用前面的计算结果,所以f(3)只计算1次

3 思路分析

假设输入的n、m均时不超过100的正整数,完成下面的判断题和选择题

判断题

22.当输入为"7 3"时,第19行用来取最小值的min函数执行了449次( )

答案 F

分析

19行min的计算次数有2步组成
1 for循环的次数,循环1次调用1次min函数
2 每次for循环包括2个递归调用,可以分别计算,由于递归调用出现多次重复计算,可以转换递推减少计算
令C(i,j)表示i行,j列时递归执行次数,计算如下表格,可以找到对应规律

23.输出的两行整数总是相同的( T )

分析

2行正数,对应2个函数的输出
从2个函数看,一个实现方式是递归,一个实现方式是动态规划,即递推记录到数组
初始值相同并且递归、递推式相同,所以在输入相同的情况下,输出结果相同

24.当m为1时,输出的第一行总为n( )

分析

//第1行输出,对应f函数
//从程序看m为1时 返回n 不进行递归调用,所以第1行总为n 
if(m == 1) return n;

单选题

25.算法g(n,m)最为准确的时间复杂度分析结果为( C )

A. O( n 3 / 2 m n^{3/2}m n3/2m)

B. O(nm)

C. O( n 2 m n^2m n2m)

D. O( n m 2 nm^2 nm2)

分析

/*
  算法g(n,m)的时间复杂度主要取决于如下代码
  时间复杂度使用大O表示法
  对于足够大的输入规模,我们往往不需要花费很大力气计算太精确的结果,通常指关系增长级量,即算法的渐进效率
  所以for(int k=1;k<=i;k++) 中i和n不完全一致,但规模有相关性,因此通常使用n
  所以如下3层嵌套循环时间复杂度O(n*m*n)
*/
30     for(int i=1;i<=n;i++){
31         for(int j=2;j<=m;j++){
32             h[i][j]=numeric_limits<int>::max();
33             for(int k=1;k<=i;k++)
34             h[i][j]=min(
35                 h[i][j],
36                 max(h[i-k][j],h[k-1][j-1])+1);
37         }
38     }

26.当输入为"20 2"时,输出的第一行为( C )

A. “4”

B. “5”

C. “6”

D. “20”

分析

第1行输出,对应f函数的返回值,由于f函数和g函数功能相同,g函数减少重复计算,所以我们可以g函数对应的值
g函数初始化了h[n][m]数组
m=1时,对应第1列初始值为n,分别1,2,3,4....
n=1时,第0行全是0
根据如下程序对应第2列赋值
h[1][1]=max(h[0][2],h[0][1])+1=1
h[2][2]=min(max(h[1][2],h[0][1])+1,max(h[0][2],h[1][1])+1)=min(1+1,1+1)=2
h[3][2]=min(max(h[2][2],h[0][1])+1,max(h[1][2],h[1][1])+1,max(h[0][2],h[2][1])+1)=min(2+1,1+1,2+1)=3
/*
  2行2列时,如下图红色箭头四对,每一对取最大值+1
  取4对中的最小值
*/
h[4][2]=min(max(h[3][2],h[0][1])+1,max(h[2][2],h[1][1])+1,max(h[1][2],h[2][1])+1,max(h[0][2],h[3][1])+1)=3
30     for(int i=1;i<=n;i++){
31         for(int j=2;j<=m;j++){
32             h[i][j]=numeric_limits<int>::max();
33             for(int k=1;k<=i;k++)
34             h[i][j]=min(
35                 h[i][j],
36                 max(h[i-k][j],h[k-1][j-1])+1);
37         }
38     }
/*
 5行2列也是同样计算,结果为3
 20行2列计算结果为6
*/

27.(4分)当输入为"100 100"时,输出的第一行为( B )

A. “6”

B. “7”

C. “8”

D. “9”

分析

入参非常大无论递归和动态规划表格计算都会有巨大的计算量

这个问题是测试鸡蛋硬度的问题,问题大概描述如下:
小明用2个玻璃瓶,在总高88层大楼测试瓶子硬度,拿1个从某层摔下去,瓶子没摔碎,到更高层去摔,如果碎了,拿另1瓶子到更低层摔
问测试出瓶子最大硬度最少摔几次?

上面程序通过递归和动态规划解决这个问题,主要是瓶子数量有限制,
在每一层,建设当前为k层都去试一下,如果碎了,少1个鸡蛋到更少的区间测试h[k-1][j-1]
如果没碎,到更高的高度去测试,测试的这些结果去最小值

此题如果瓶子足够的情况下,可以使用2分去测试,只要最多用7个鸡蛋就可以测试鸡蛋硬度最大可到第几层

2^7=128>100

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用docker离线制作es镜像,方便内网环境部署

1、自己在本地安装docker以及docker-compose 2、拉取elasticsearch镜像 docker pull elasticsearch:7.14.0 docker pull kibana:7.14.0 3、将拉取到的镜像打包到本地目录 docker save elasticsearch:7.14.0 -o /Users/yanjun.hou/es/elasticsearch-7.14.0.tar docker save kib…

application/x-www-form-urlencoded和json的区别

application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式&#xff0c;常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下&#xff1a; 1. application/x-www-form-urlencoded •特点&#xff1a;这是一种传统的表单提交时采用的编码类型&#x…

# 消息中间件 RocketMQ 高级功能和源码分析(五)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;五&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;NameServer 路由元数据 1、消息中间件 RocketMQ 中&#xff0c;NameServer 路由管理 NameServer 的主要作用是为消息的生产者和消息消费者提供关于主题 To…

相交链表(Leetcode)

题目分析&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 相交链表&#xff1a;首先我想到的第一个思路是&#xff1a;如图可知&#xff0c;A和B链表存在长度差&#xff0c;从左边一起遍历链表不好找交点&#xff0c;那我们就从后面开始找&#xff0c;但是这是单链表&…

惊天大瓜陈晓与陈妍希婚姻生变

惊天大瓜&#xff01;陈晓与陈妍希婚姻生变&#xff0c;疑似去年底已走向终点娱乐圈再次掀起波澜&#xff01;今日&#xff0c;知名狗仔曝光了一段视频&#xff0c;内容直指陈晓与陈妍希这对曾经的金童玉女疑似婚姻破裂。据悉&#xff0c;陈晓在去年底单方面向陈妍希提出了离婚…

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…

Gin 详解

Gin 介绍 gin框架是一个基于go语言的轻量级web框架&#xff0c;它具有高效性、灵活性、易扩展性路由 gin框架使用的是定制版的httprouter 其路由原理是大量使用公共前缀的树结构&#xff0c;注册路由的过程就是构造前缀树的过程。 具有公共前缀的节点也共享一个公共父节点。…

【第19章】Vue实战篇之主页面

文章目录 前言一、代码1. 主界面代码2. App.vue 二、展示总结 前言 登录完成之后&#xff0c;应该自动跳转到主页面&#xff0c;接下来我们搭建主界面。 一、代码 1. 主界面代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchBut…

Linux搭建Minio单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Linux搭建Minio单机环境 ⏱️ 创作时间&#xff1a; 2024年06月19日 目…

群辉DSM7下ZeroTier的安装

目录 一、起因 二、具体操作 1、添加组件源: 2、安装套件 3、开启ssh 4、连接ssh执行修补 5、手工启动ZeroTier 6、使用终端命令加入网络 7、审核通过该节点的加入 三、测试链接 1、PC端测试 2、手机APP测试 ZeroTier 是一款异地组网工具,它可以将不同网络环境的设…

鸿蒙开发通信与连接:【@ohos.bluetooth (蓝牙)】

蓝牙 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 蓝牙模块提供了基础的传统蓝牙能力以及BLE的扫描、广播等功能。 导入模块 import bluetooth from ohos.bluetooth;bluetooth.enableBluet…

PCB设计隐藏的陷进

1、BGA芯片的开窗和过油设计。 加工工艺中&#xff0c;范式过孔都需要盖油设计&#xff0c;实心焊盘需要开窗设计&#xff0c;坚决不能盖油。 2、通孔设计的互联连通性 比如H3芯片的wifi设计&#xff0c;实际上是没有联通的&#xff0c;虽然四层板的中间层有焊盘&#xff0c;但…

复旦大学:将推出至少100门AI领域课程

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 最近AI圈又发生了啥&#xff1f; 复旦大学&#xff1a;将在下一个学年推出至少100门AI领域课程 复旦大学召开2024年招生培养政策发布会&#xff0c;公布今年本科招生培养政策亮点。从今年秋季学期开…

【黑马TS】学习资料Day4

五、在 React 中使用 TypeScript 现在&#xff0c;我们已经掌握了 TS 中基础类型、高级类型的使用了。但是&#xff0c;如果要在前端项目开发中使用 TS&#xff0c;还需要掌握 React、Vue、Angular 等这些库或框架中提供的 API 的类型&#xff0c;以及在 TS 中是如何使用的。 …

ARCGIS 如何对河流等线条图形进行Smooth处理——具有多个断点高阶版

1.线转点折点&#xff08;注意&#xff01;很重要&#xff0c;不是线转点&#xff09; 2.点转线步骤 ## 3 线的融合 2.1 新建Filed 》短精度类型》利用选择工具的 线文件。全选同一条河流点&#xff0c;进入Tabel的选择界面。给同一条河赋值同一个值。 大功告成&#xff01;…

upload-labs第十三关教程

upload-labs第十三关教程 第十三关一、源代码分析代码审计 二、绕过分析1&#xff09;0x00绕过a.上传eval.pngb.使用burpsuite进行拦截修改之前&#xff1a;修改之后&#xff1a;进入hex模块&#xff1a; c.放包上传成功&#xff1a; d.使用中国蚁剑进行连接 2&#xff09;%00绕…

amov无人机连接;+数据传输;啊啊啊啊啊

socket传输数据: 局域网连接 连接---通信(命令行直接;)--- 传输数据(socket)--传输内容:launch文件; qgc连接; 1.局域网下的通信 1.1 局域网 厂家提供的方式是通过Homer图数传工具(硬件)构建的amov局域网实现通信连接. 好处是通信距离足够长,支持150m;坏处是"局部&qu…

SpringBoot配置第三方专业缓存技术Redis

Redis缓存技术 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统&#xff0c;通常用作数据库、缓存和消息中间件。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了丰富的功能和灵活的…

用Selenium自动化Web应用测试!

在开发和维护Web应用时&#xff0c;测试是确保应用正常运行的关键环节。手动测试不仅费时费力&#xff0c;而且容易出错。而通过使用Selenium&#xff0c;程序员可以轻松模拟用户交互、验证页面元素&#xff0c;从而自动化测试过程&#xff0c;提升测试效率和准确性。 解决的问…

【TB作品】MSP430G2553,单片机,口袋板, 多路温度巡回检测仪的设计

题7 多路温度巡回检测仪的设计 设计一个多路温度检测仪&#xff0c;共有8个测温点&#xff0c;每个点连续检测8次&#xff0c;以平均值代表该点温度&#xff0c;并轮流在LED显示器上显示。测试检测元件为铂热电阻Pt1000, 温度测量范围为100℃ ——500℃&#xff0c;测量精度为1…