又一周结束啦,回想起来,这周倒也算抗住了,周一到周五正常学习算法,感觉时间超级快,一周基本都在搞数据结构,倒也充实,周五打了一场月赛,战绩还是 6ac3,第四题看出来是 dp 但很无力啊,还没开到 dp,希望回头再来补喽,然后第五题竟然是一道二分前缀和,我并没能写出来,考场上没能分析出来,一直感觉是我无法解决的问题。。。今天下午学校组织了第一次周赛,令人不解的是一共七题全部是构造,数学问题,似乎我能做到的地方并没有用到什么算法,这其实有点失望,不过好在运气不错,第二道的位运算构造似乎卡住很多同学,我也是因为上次刚好在 cf 上写了一道类似,记忆比较深刻,最后 ac3 道,赛后发现很多同学都是 ac3 道,只赢在罚时而已。。。第四第五也都开了,不过都 wa 了。接下来这周就开搜索和 dp 啦,下周二打一场 cf,周日天梯赛选拔,希望成绩能进步!不过接下来还有好多麻烦事,导员要开始严查课,每周六要和同学打羽毛球,还有考驾照,还有家教。。。思来想去,决定周六拿出来解决这些问题是,刚好上午驾照,下午羽毛球,晚上家教,管理大师!
优先队列 #include <queue>
代码 含义
q.push(ele) 元素ele入栈增加元素 (logN)
q.pop() 弹出队首元素 (logN)
q.top() q.top() == 队首元素
q.empty() 判断栈内是否为空,空为真
q.size() 返回栈内元素的个数
没有 clear!!!设置优先级1234567//默认大根堆,每次取出最大元素priority_queue<int> q;//小根堆,每次取出最小元素priority_queue<int, vector<int>, greater<int>> q;//less<int> 表示数字大的优先级大,堆顶为最大的元素//greater<int>表示数字小的优先级大,堆顶为最小的元素
pair代替二元结构体
12345678910111213141516171819//头文件#include <utility>//1.初始化定义pai ...
栈 代码 含义
s.push(ele) 元素ele入栈增加元素
s.pop() 弹出栈顶元素
s.top() s.top() == 栈顶元素
s.empty() 判断栈内是否为空,空为真
s.size() 返回栈内元素的个数
数组模拟栈的遍历12345678910// 栈 从左至右为栈底到栈顶int s[100];// p 代表栈顶指针,初始栈内无元素,p为-1int p = -1;for(int i = 0; i <= 11; ++i) { //入栈 s[++p] = i;}// 出栈int top_element = s[p--];
栈的应用题目大意:有 n 个人从左到右排成一队,全部人向右看,每个人会被比自己高的人挡住,求出每个人是被哪个位置的人挡到。如果没有被挡住就输出 0。
思考:因为向右看,所以最右一个人一定是输出 0,从右向左考虑,如果一个人 a,a 的左边人如果比 a 高,那么 a 就失去挡住别人的能力,如果左边人比 a 矮,那么两人都可能有挡住别人的能力。
代码模板 ...
这周是开学第一周,每天时间基本都花在了算法上,这一周算法学习了两章,博客发布了 7 篇原创,学习状态还不错,不过下一周就是天梯赛选拔,然后四月又有蓝桥杯,感觉进度还是很紧张,决定重头学习算法,导致搜索,图论,dp 这些到现在都还没开,打了一场牛客周赛,一场 cfdiv.3,成绩都很差。。。苦恼啊,希望下周进度可以好些,成绩涨涨涨!再有就是最近各种计算机细分方向开始成为同学们讨论的话题,各种眼花缭乱的技术相当吸引人,不过问题就是如何选择?几次动摇后,最终还是决定与其纠结,不如踏实做好现在手头的事,让子弹再飞会,别急,会变好的吧。。。现在是 2025.3.3 0:11 今天就是生日!期待一下明天开心一整天!订了两个大大的蛋糕,嘿嘿给同学们一个惊喜~~
本博文转载自 黑马程序员 的开源资料,只是为了方便自己学习,并非盗用他人成果!C++核心编程本阶段主要针对 C++==面向对象==编程技术做详细讲解,探讨 C++中的核心和精髓。
1 内存分区模型C++程序在执行时,将内存大方向划分为4 个区域
代码区:存放函数体的二进制代码,由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量
栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区意义:
不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程
1.1 程序运行前 在程序编译后,生成了 exe 可执行程序,未执行该程序前分为两个区域
代码区:
存放 CPU 执行的机器指令
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此.
全局区还包含了常量区, 字符串常量和其他常量也存放在此.
...
本博文转载自 黑马程序员 的开源资料,只是为了方便自己学习,并非盗用他人成果!C++提高编程
本阶段主要针对 C++==泛型编程==和==STL==技术做详细讲解,探讨 C++更深层的使用
1 模板1.1 模板的概念模板就是建立通用的模具,大大提高复用性
例如生活中的模板
一寸照片模板:
PPT 模板:
模板的特点:
模板不可以直接使用,它只是一个框架
模板的通用并不是万能的
1.2 函数模板
C++另一种编程思想称为 ==泛型编程== ,主要利用的技术就是模板
C++提供两种模板机制:函数模板和类模板
1.2.1 函数模板语法函数模板作用:
建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
语法:
12template<typename T>函数声明或定义
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用 class 代替
T — 通用的数据类 ...
本博文转载自 黑马程序员 的开源资料,只是为了方便自己学习,并非盗用他人成果!C++基础入门1 C++初识1.1 第一个 C++程序编写一个 C++程序总共分为 4 个步骤
创建项目
创建文件
编写代码
运行程序
1.1.1 创建项目 Visual Studio 是我们用来编写 C++程序的主要工具,我们先将它打开
1.1.2 创建文件右键源文件,选择添加->新建项
给 C++文件起个名称,然后点击添加即可。
1.1.3 编写代码1234567891011#include<iostream>using namespace std;int main() { cout << "Hello world" << endl; system("pause"); return 0;}
1.1.4 运行程序
1.2 注释作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码
两种格式
单行注释:// 描述信息
通常放在一行代码的上方,或者一条语句的末尾,= ...
三分法用来解决单峰单谷问题,经典二次函数型的变化时,可以使用三分优化当问题是解决一堆都是整数的问题时,较为简单,模板代码如下:1234567891011121314151617181920#include <iostream>using namespace std;//下面就是要寻找的二次函数型数组,目标是找到其中的最大值int a[10] = { 0, 3, 25, 21, 20, 14, 12, 7, 2, 1 };int main(){ int z = 0, y = 9; while (z <= y) { //三分,就是将区间尽量平均分成三份 int mid1 = z + (y - z) / 3; int mid2 = y - (y - z) / 3; //判断两者中的较大值,那么较小值的一方的元素都不可能是最大值,直接舍去 if (a[mid1] >= a[mid2]) y = mid2 - 1; else z = mid1 + 1; } //最终结果位置与二分类似 cout < ...
二分(手搓)一.找出第一个大于等于 x 的元素1234567891011121314151617181920212223#include <iostream>#include <algorithm>using namespace std;int a[200005];int main(){ int n, x; cin >> n >> x; for (int i = 1; i <= n; i++) cin >> a[i]; int z = 1, y = n; //核心代码 while (z <= y) { //这里其实mid = (z + y) / 2,而下面的写法是为了防止有时候爆int int mid = z + (y - z) / 2; //下面两个条件判断,哪个不取等,就输出哪个 if (a[mid] >= x) y = mid - 1; else z = mid + 1; } cout << z; //cout << y + 1 ...
算法笔记
未读取余公式(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p ) % p
(a * b) % p = (a % p * b % p) % p
快速幂利用倍增思想,当求解 a 的 b 次方时,代码如下
12345678910111213141516171819202122232425262728#include <iostream>using namespace std;using ll = long long;ll quik_pow(ll a, ll b){ //temp存放 a^1, a^2, a^3, a^4....... ll temp = a; ll ans = 1; while (b) { //判断b的二进制的最后一位是否为1,是1就算入总结果 if (b & 1) ans = ans * temp; //随着b的二进制右移逐渐递变 temp = temp * temp; //b的二进制右移(舍弃最后一位 b >>= 1; & ...