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

news2024/11/22 12:13:32

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

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

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

相关文章

LMStudio下载模型

笔者在使用LMStudio时下载模型报超时&#xff0c;科学上网也无法解决。&#xff08;LMStudio下载模型时直接走的网关&#xff0c;没有走代理&#xff09; 解决办法如下: 1. 安装软路由并科学上网。 2. 手动下载模型&#xff0c;由于LMStudio解析模型时具有特定的要求&#x…

C++ 79 之 自己写异常类

#include <iostream> #include <string> using namespace std;class MyOutOfRange : public exception{ // 选中exception右键 转到定义 复制一份 virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW 进行函数重写 public: string m_msg;M…

SpringCloud Netflix和SpringCloud Alibaba核心组件

1.SpringCloud Netflix组件 1.1 Netflix Eureka-服务注册发现 Eureka 是一种用于服务发现 的组件&#xff0c;它是一个基于 REST 的服务&#xff0c;用于定位运行在 AWS 弹性计算云&#xff08;EC2&#xff09;中的中间层服务&#xff0c;以便它们可以相互通讯。 注册&#xf…

移植案例与原理 - HDF驱动框架-驱动配置(2)

1.2.7 节点复制 节点复制可以实现在节点定义时从另一个节点先复制内容&#xff0c;用于定义内容相似的节点。语法如下&#xff0c;表示在定义"node"节点时将另一个节点"source_node"的属性复制过来。 node : source_node示例如下&#xff0c;编译后bar节点…

实现跑马灯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 跑马灯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Color[] colors { Color.Red, Color.Green, Color.Yellow };T…

IO流2.

字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…

【数据分享】《中国林业和草原统计年鉴》1992-2022

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

YOLOV8 目标检测:训练自定义数据集

1、下载 yolov8项目&#xff1a;ultralytics/ultralytics&#xff1a;新增 - PyTorch 中的 YOLOv8 &#x1f680; > ONNX > OpenVINO > CoreML > TFLite --- ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreM…

【面试题】Spring常见面试题整理2024(全是干货!!!)

备战实习&#xff0c;会定期给大家整理常考的面试题&#xff0c;大家一起加油&#xff01; &#x1f3af; 注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 系列文章目录 【面试题】MySQL常见面试题总结【面试题】面试题分享之JVM篇【面试题…

基于支持向量机的垃圾邮件分类,使用SVM+flask+vue

sms-classify 基于支持向量机的垃圾邮件分类&#xff0c;使用SVMflaskvue 数据集和源码地址 数据集 SMS Spam Collection Data Set 来源于 UCI。样例被分为非垃圾邮件&#xff08;86.6%&#xff09;和垃圾邮件&#xff08;13.4%&#xff09;&#xff0c;数据格式如下&#xff…

【尚庭公寓SpringBoot + Vue 项目实战】登录管理(十八)

【尚庭公寓SpringBoot Vue 项目实战】登录管理&#xff08;十八&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】登录管理&#xff08;十八&#xff09;1、登录业务介绍2、接口开发2.1、获取图形验证码2.2、登录接口2.3、获取登录用户个人信息 1、登录业务介绍 登…

迭代器模式观察者模式

文章目录 1.引出迭代器模式1.展示院系结构2.传统方式 2.迭代器模式解决院系结构展示问题1.基本介绍2.原理类图3.类图4.代码实现1.Department.java 存储信息的对象2.College.java 被迭代的类型接口3.ComputerCollege.java 被迭代的具体实现类&#xff0c;存储数据并将其在创建迭…

2024年6月22日(星期六)骑行谷仓坝

2024年6月22日 (星期六) 骑行谷仓坝&#xff0c;早8:00到8:30&#xff0c; 龙泉小学门口(北京路尽头&#xff0c;高架桥下&#xff09;&#xff0c;9:00准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:集合 &#xff0c;家住东&#xf…

【Ruby基础01】windows和termux中搭建Ruby开发环境

windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn&#xff0c;安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件&#xff0c;按照里面的流程…

【Stable Diffusion 3】本地部署SD3详细教程

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 1. Stable Diffusion 3 模型下载 「点…

【4003】基于springboot实现的线上阅读系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

emm, ComfyUI的作者从Stability.AI离职了

&#x1f356;背景 今天在更新ComfyUI的过程中&#xff0c;看到Manager中有这样一段描述&#xff1a; 嗯&#xff1f;做了新的官方网站&#xff1f;然后开始新篇章&#xff1f; 难道说ComfyUI的作者从Stability.AI离职了&#xff1f; 赶紧点开链接看了下&#xff0c;emm&…

关于INCA的几个实用功能

01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内&#xff0c;点击实验→加载VUI窗口 选择空的窗口 打开后如下所示&#xff1a; 点击UI开发模式&#xff0c;如下图 如下&#xff1a; 添加标定量、观测量、示波器 窗口的大小需要在开发…

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针&#xff0c;分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast&#xff0c;最后一个空间的下一个位置Myend&#xff1b;当你插入数据的时候&#xff0c;先判断当前容量够不够&…

电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法

在数字化时代&#xff0c;多媒体文件的处理已经成为我们日常生活和工作中不可或缺的一部分。在计算机使用过程中&#xff0c;丢失ffmpeg.dll文件是一个特定但常见的问题&#xff0c;尤其是对于那些经常处理视频编解码任务的用户来说。下面小编讲全面分析ffmpeg.dll丢失原因以及…