学习报告及总结

article/2025/9/23 23:22:52

嘎嘎嘎,通过23日到28日某校某老师的生动讲解,让本蒟蒻更加理解了一些知识

day1:分治以及归并

分治:

顾名思义:分而治之。

作为一个非常人(ě)(xīn)的算法,度娘给出的解释如下:

把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

感觉挺清晰易懂的,就不再赘述

举一个栗子

该题就是一道分治的典型例题,和循环比赛的解法类似,不做过多的讲解(看见题解里的大佬用位运算解决的我瑟瑟发抖)

不过还是要练习分治呀,毕竟又不是所有的题都能用位运算解决


归并:

归并就是将序列一直分下去,直到不能再分为止,即子序列的长度为1,然后再进行合并,把小的数放在前面,达到排序的效果(为什么不叫做分并算法,不是更形象吗)

贴图喽

由此可见,归并的时间复杂度仅为O(nlogn),十分地迅速,并且还是一个稳定排序

那么,归并有什么用呢?

栗子来喽

双倍经验是不是

此题仔细读后可知,不就是个逆序对(不屑)

其实我们知道,归并排序就是将两个有序的序列合并为一个有序的序列,并且前面一个序列的下标总是比后面一个序列的下标,所以只要我们比较到后一个序列的某个数小于前一个序列对应的那个数,则那个数一定都比前一个序列的剩下的元素都要小,于是就可以统计答案

不清晰,举栗子:

假设有两个有序序列 A = {1,2,7,8,11} 和 B = {3,4,5,9,10},当A序列中的7B序列中的3进行比较时,可以看出7 > 3,所以A序列中的7以及它后面的所有的元素都可以与3组成逆序对

剩下的同理,不再解释,相信各位奆佬早就搞定了这一个算法

day2:二分查找算法

二分:

就是把一个序列分成两个部分,之后再进行一些操作

二分查找和二分答案不同,二分答案多半要写个check函数,但二分查找多半不用

再来栗子

这道题可以用lower_bound函数解决,调用方法如下

int x = lower_bound(a + 1, a + 1 + n, k) - a;
//x储存的是在a数组的1-n以内的位置中第一个值大于等于k元素的下标。因为返回值是一个地址,所以还要减去数组的地址,即数组名

 当然,lower_bound还是要掌握手写的方法,理解它的原理,这里不再讲解

还是贴个lower_bound手写代码吧

#include<bits/stdc++.h>
using namespace std;
#define SF scanf
#define PF printf
int a[105];
int Lower_bound(int l, int r, int x) {while(l + 1 < r) {int mid = (l + r) >> 1;if(a[mid] >= x) r = mid;else l = mid;}return r;
}
int main() {int n;SF("%d", &n);for(int i = 1; i <= n; i++) {SF("%d", &a[i]);}int m;SF("%d", &m);PF("%d", Lower_bound(0, n + 1, m));return 0;
}

注:二分算法一定要有单调性 

day3 + day4:二分答案算法

二分答案:

前提:知道答案的范围并且有“最大值最小”或“最小值最大”之类的词眼

二分答案可以分为4个步骤进行:

1、分什么?

2、怎么分?

3、比什么?

4、怎么比?

先解决第一个步骤。这个步骤很简单,都是二分答案算法,不分答案分啥啊?

再解决第二个步骤。我们一般用二分法进行这个操作。注意:while循环的条件以及mid的求法很重要,写错了就会T到飞起。有while循环如下的写法:

1、

while(l + 1 < r)

 2、

while(l < r)

3、

while(l <= r)

mid的求法有如下的写法:

1、

mid = (l + r) >> 1;

2、

mid = (l + r + 1) >> 1;

一定要根据题目的意思再进行斟酌,因题而异

接着解决第三个和第四个步骤。我们在分答案时,大概率不能直接用mid和答案进行比较,通常会写一个check函数,得到mid在进行check操作之后的值再与答案进行比较

我爱栗子

这道题还是一样,先二分答案,按坐标从小到大排个序。主要是check函数该怎么写

我们知道,我们分的是答案,所以我们要求出在满足我们分出答案的条件下的最多可以放置的奶牛数量

check函数如下,详见注释:

int check(int x) {//x为分出来的答案int cnt = a[1] + x;//因为第一头奶牛一定在a[1]点处,若要满足答案,则第二只奶牛的坐标至少要比        //a[1]多x,故为a[1] + x;int sum = 1;//sum为在满足答案的情况下最多可以放置的奶牛数for(int i = 2; i <= n; i++) {//1-n做循环if(a[i] >= cnt){//说明该奶牛可以在a[i]点处sum++;//累计答案cnt = a[i] + x;//理由同上}}return sum;//返回答案
}

好了,接下来我们接着分析

如果我们的返回值sum小于等于题目中要求的奶牛数,因为题目中要求的是最长的距离,所以要把左区间 l 置为 mid,不能置为mid + 1,因为有可能 mid 就是答案,不能跳过mid。如果返回值sum大于题目中要求的奶牛数,那我们就可以放放心心地将右区间 r 置为 mid - 1

完整代码:

//早期猿人代码,不好看,将就看吧
#include<bits/stdc++.h>
using namespace std;
int n,c,l,r,mid;
int a[1000005];
bool check(int x){int cut=a[1]+x;int sum=1;for(int i=2;i<=n;i++){if(a[i]>=cut){sum++;cut=a[i]+x;}}return sum>=c;
}
int main(){cin>>n>>c;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+1+n);l=0;r=a[n]-a[1];while(l<r){mid=(l+r+1)/2;//注意,此处不+1会TLE,你可以枚举一下只剩两个数的情况,就知道原因了if(check(mid))l=mid;else r=mid-1;}cout<<r;return 0;
}

好了,二分答案也算是一个比较重要的算法,写起来必须要得心应手啊

day5:队列

所谓队列,就是类似于我们生活中排队买票一样,先到的先买,买完就走。所以队列就是一种先进先出的线性结构

没有好吃的栗子了呜呜呜

数组模拟:

众所周知,队列有以下几种基本操作可以用数组模拟实现:

push(x) —— 将x这个元素加进队列中

pop() —— 将队头元素删除

empty() —— 判断队列是否为空

clear() —— 清空队列

front() —— 输出的队头元素

相信这些基本操作根本难不倒大家,只需要用双指针模拟就可以了,l 指向队头,r 指向队尾

还是贴个代码吧

#include<bits/stdc++.h>
using namespace std;
#define SF scanf
#define PF printf
int a[20005], l = 1, r = 1;//双指针法
void push(int s){//将元素压入队列中a[r++] = s;
}
void front(){//取出队头元素if(l != r) {//判断是否为空PF("%d\n", a[l]);}else {PF("error\n");}
}
void pop(){//删除队头元素if(l != r) {//判断是否为空l++;}else {PF("error\n");}
}
void clear(){//清空队列l = r;
}
void empty(){//判断是否为空if(l == r) {//只要左指针与右指针相同就为空PF("empty\n");}else {PF("not empty\n");}
}
int main() {int n;SF("%d", &n);for(int i = 1; i <= n; i++) {string x;cin >> x;if(x == "push") {int s;SF("%d", &s);push(s);}else if(x == "front") {front();}else if(x == "pop") {pop();}else if(x == "clear") {clear();}else {empty();}}return 0;
}

STL:

首先我们需要头文件:include<queue>

定义:queue<类型> 名称;

我们一般用q作为队列的名称

函数调用:

q.push(x) —— 将x压入队列中

q.pop() —— 将队头元素删除

q.front() —— 输出队头元素

q.empty() —— 判断队列是否为空。若为空返回1,否则返回0

q.size() —— 获取队列的长度,即队列中元素的个数

队列作为很经典的STL,也是十分实用的东西。大家也可以尝试一下自己去模拟一下循环队列

补充

优先队列:

定义:priority_queue<int> q;

学名:大根堆

人话版:

q里面的元素自动按照从大到小排序

TA的兄弟:priority_queue<int, vector<int>, greater<int> > q;

注意:最后必须要打空格,不然会识别成右移运算符

学名:小根堆

人话版:

q里面的元素自动按照从小到大排序

是不是更实用了哈哈哈

day6:栈

所谓栈,与队列就只有一点不同:队列是先进先出,栈是先进后出,就像一个杯子一样

栗子被吃完了呜呜呜

数组模拟:

用数组模拟的栈的操作与上面的队列一样,这里只说方法

队列需要双指针模拟,栈不一样,栈只需要单指针 r 充当右指针就行了

代码:

#include<bits/stdc++.h>
using namespace std;
#define SF scanf
#define PF printf
int a[20005], r = 0;//r充当栈的右指针
void push(int s) {//将s压入栈中a[r++] = s;
}
bool empty() {//判断栈是否为空if(r == 0) return true;else return false;
}
void pop() {//删除栈顶元素r--;
}
void clear() {//将栈清空r = 0;
}
void top() {//输出栈顶元素PF("%d\n", a[r - 1]);
}
int main() {int n;SF("%d", &n);for(int i = 1; i <= n; i++) {string x;cin >> x;if(x == "push") {int s;SF("%d", &s);push(s);}else if(x == "top") {if(!empty()) top();else PF("error\n");}else if(x == "pop") {if(!empty()) pop();else PF("error\n");}else if(x == "empty") {if(!empty()) PF("not empty\n");else PF("empty\n");}else {clear();}}return 0;
}

STL:

头文件:include<stack>

定义:stack<类型> 名称;

我们一般用s作为栈的名称

函数调用:

s.push(x) —— 将x压入栈中

s.pop() —— 将栈顶元素删除

s.front() —— 输出栈顶元素

s.empty() —— 判断栈是否为空。若为空返回1,否则返回0

s.size() —— 获取栈的长度,即栈中元素的个数

栈和队列一样,都是STL中很实用的东西,也是很简单的,但是也非常重要。要学会bfs搜索,就必须要学会队列。栈也是计算机中储存数据的基本线性结构,所以必须要掌握呀!

撒花~~~~~完结了

really?

YES!


http://chatgpt.dhexx.cn/article/CW9h5Aq1.shtml

相关文章

历史学习情况

2019年~2023年 深圳图书馆借书累计154册 阅读过的技术类书籍包括 《知识表示与处理》《自然语言入门》《聊天机器人》《微机原理与应用》《单片机原理》《现代通信技术》《机械设计基础》等。 2021年 英语累计背诵210天&#xff0c;考研英语的单词书背诵过一遍。 2019年~2…

一周学习情况

1.首先是忘了在哪里刷到的题目&#xff0c;是一个矩阵求最大值问题&#xff0c;采用了二维数组循环和 if语句&#xff0c;基于对数组的不熟悉&#xff0c;一开始并没有想到什么头绪&#xff0c;只能想到把数组大小比较&#xff0c;想一开始学到的最基础的设置字母来比较&#x…

本周学习情况

上面是路由中props接收参数 上图是缓存路由组件和保持组件挂载 然后学习了replace属性和路由守卫 vue2已经学完了 然后现在就开始复习 这周练习写了鸿蒙OS首页和工作室官网页面 新的知识学习得不多 &#xff08;鸿蒙首页未使用vue 复习了JS和CSS&#xff09; 上图为鸿蒙…

目前学习状况总结

不知不觉大三下学期了&#xff0c;从大二开始就在课余时间自学java。 基本上是按这两张图的路线来学习的&#xff0c;学习资料主要是黑马培训的教学视频&#xff0c;另外结合网上的一些java学习网站&#xff0c;例如CSDN、开源中国、网易云课堂等。在学习的过程中&#xff0…

2022年学习和实习总结——收获颇多

0 序言 时间已经进入了2023年&#xff0c;今年将是属于我们这一届秋招的一年。回顾2022年的学习和实习历程&#xff0c;我觉得今年学习收获还是不少的&#xff0c;甚至可以说是整个高等教育生涯中&#xff0c;收获最多的一年。 1 学习情况总结 1.1 读书和学习总结 1…

python语言中函数在调用前必须先定义吗_Python函数必须先定义,后调用说明(函数调用函数例外)...

java开发者在定义类中的方法时,不会关心方法的定义相对于调用语句的位置。 但是python中需要注意: 函数必须先定义、后调用(函数调用函数例外)。 如下为示例说明: 1、python函数的应用一般需要:先定义、后调用: 2、如果函数定义在调用之后,执行将报错: 3、函数中调用函数…

JS函数之间的调用(函数内调用一个函数、调用函数内部的函数)

文章目录 JS函数内调用一个函数JS在外部调用函数内部的函数 JS函数内调用一个函数 代码示例 要点&#xff1a;在一个函数内调用另外一个函数&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;常用&#xff09;&#xff08;分开写两个function 函数&#xff0c; 然…

子函数调用

子函数调用子函数 定义&#xff1a;能被其他程序调用&#xff0c;在实现某种功能后能自动返回到调用程序去的程序。其最后一条指令一定是返回指令&#xff0c;故能保证重新返回到调用它的程序中去。也可调用其他子程序&#xff0c;甚至可自身调用&#xff08;如递归&#xff09…

C语言跨文件调用函数

将函数写在一个头文件中。 首先是头文件&#xff0c;也就是被引用的文件。 /* single_methods.h */ #include <limits.h> #include <stdio.h> #include <stdlib.h>int str2int(char c) {switch (c){case A:return 0;case C:return 1;case G:return 2;case …

python 基础-如何调用函数

学习是对自己最好的投资,而机会属于有准备的人,这是一个看脸的时代,但最终拼的是实力。人和人之间的差距不在于智商,而在于如何利用业余时间,所以没有等出来的辉煌,只有干出来的精彩。其实只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时…

js中以构造函数方式调用函数

构造器函数&#xff08;Constructor functions&#xff09;的定义和任何其它函数一样&#xff0c;我们可以使用函数声明、函数表达式或者函数构造器&#xff08;见以前的随笔&#xff09;等方式来构造函数对象。 要以构造函数的方式调用函数&#xff0c;只需要在调用时在函数名…

matlab经典调用函数,Matlab怎么调用函数 自定义函数使用方法

Matlab作为一款专业性极强的商业数学软件&#xff0c;将诸多的算法开发、统计分析、数据可视化功能融入其中&#xff0c;用户可以方便地调用需要的函数&#xff0c;建立数学模型&#xff0c;为了满足你工作的需要&#xff0c;还可以自行设置自己需要的函数&#xff0c;下面就跟…

matlab中的函数调用法则,Matlab怎么调用函数?调用函数技巧一览

Matlab作为一款专业性极强的商业数学软件&#xff0c;将诸多的算法开发、统计分析、数据可视化功能融入其中&#xff0c;用户可以方便地调用需要的函数&#xff0c;建立数学模型&#xff0c;为了满足你工作的需要&#xff0c;还可以自行设置自己需要的函数&#xff0c;下面就跟…

java调用函数_Java中如何调用函数和自定义函数

展开全部 1.调用函数方法:对象名.函数名 需要实例化对象,后调用 2.自定义32313133353236313431303231363533e4b893e5b19e31333365663433函数: 结构为:[方法修饰符] ([]) {方法体 } 有以下几种函数: 方法有2种修饰符 1)有public、protected、private三种显示的访问控制修饰…

调用函数

我们定义函数的目的就是调用此函数。 下面来介绍一下调用函数&#xff1a; 函数调用的形式 调用函数的一般形式为&#xff1a; 函数名&#xff08;实参表列&#xff09; 如果调用的是无参函数&#xff0c;则“实参表列”可以没有&#xff0c;但括号不能省略。 如果实参表列包…

函数的调用

接着 https://blog.csdn.net/jcf52/article/details/123213269https://blog.csdn.net/jcf52/article/details/123221654 来到了函数进阶&#xff1a; 一.间接调用函数 1.调用函数有直接使用函数名加参数列表的的形式调用&#xff0c;测量这种方式&#xff0c;还可以使用将…

C语言——如何调用函数

C语言——如何调用函数 一、案例: 二、函数的认知 #include <stdio.h> #include <stdlib.h>int prepare() {printf("出门前准备\n");printf("洗漱\n");printf("穿衣\n");return 0; }int onTheRoad() {printf("在路上\n…

3+1活动:结交一个朋友、参与一项运动 、培养一个兴趣爱好 、阅读一本好书

做一个热爱生活的人从31开始 结交一个朋友、参与一项运动 、培养一个兴趣爱好 、阅读一本好书 结交一个朋友 参与一项运动 培养一个兴趣爱好 阅读一本好书

Nature综述:培养未被培养微生物的创新方法

对于培养未被培养的大多数微生物的创新 Innovations to culturing the uncultured microbial majority Nature Reviews Microbiology [IF: 60.633] DOI&#xff1a;https://doi.org/10.1038/s41579-020-00458-8 发表日期&#xff1a;2020-10-22 第一作者&#xff1a;William H.…

自学系列 | 就谈兴趣!

最近接到很多读者的私信&#xff0c;基本都是有关方向的选择上以及如何自学上&#xff0c;还有部分读者问到有关前端的方向&#xff0c;能不能详细写写如果从零学习&#xff0c;能够达到找工作的标准。而且这个自学能力是我们一辈子的生存技能&#xff0c;无论干什么&#xff0…