大家好,欢迎观看我的帖子;
寒假集训结束了,我被迫写了一篇 《寒假集训总结》;
Tip :由于,寒假有两个进度, 我就把学到数据结构的一个进度叫A进度,学到递推的一个进度叫
B进度;
A进度 :
- 分治算法
分治算是算法中比较重要的思想,所谓分治,就是“分而治之”,就是把一个复杂的问题分成两
个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直
接求解,原问题的解即子问题的解的合并;
分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以
便各个击破,分而治之;
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直
接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归
地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法;
如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出
原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就
为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致
而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分
治与递归像一对兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法;
而在分治中最重要的思想是什么呢?
没错那就是二分
二分就是在此基础上每次分成等量的两份;
说到二分你们又会想到什么?
二分查找!!!
具体就是实现二分的操作,前面讨论区有神犇说过,我就不多说了;
(只要能背到就没问题)……
- 数据结构(一部分)
- 队列(先进先出)
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许
删除的一端称为队头。
队头(Front):允许删除的一端,又称队首。
队尾(Rear):允许插入的一端。
空队列:不包含任何元素的空表。
基本操作:
InitQueue(&Q):初始化队列,构造一个空队列Q。
QueueEmpty(Q):判队列空,若队列Q为空返回true,否则返回false。
EnQueue(&Q, x):入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q, &x):出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q, &x):读队头元素,若队列Q非空,则将队头元素赋值给x。
搞错了不好意思
#include <bits/stdc++.h>
using namespace std;
queue <int> a;
//入列,插入队列的末端。
//q1.push(i);
//访问队列中的元素个数
//n=q1.size();
//back。访问队列尾元素
//m=q1.back();
//访问队列首元素
//e=q1.front();
//出列,弹出队列的第一个元素,应注意,并不会返回弹出元素。
//q1.pop();
int main ()
{
}
对了,如果要使用自带的建立队列以及操作请认准:#include <queue>
万能头效果更佳
- 栈(先进后出)
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性
表只能在某一端进行插入和删除操作。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
基本操作:
InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈为空则返回true,否则返回false。
Push(&S, x):进栈(栈的插入操作),若栈S未满,则将x加入使之成为新栈顶。
Pop(&S, &x):出栈(栈的删除操作),若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素,若栈S非空,则用x返回栈顶元素。
DestroyStack(&S):栈销毁,并释放S占用的存储空间(“&”表示引用调用)。
搞错了,再来
#include <bits/stdc++.h>
using namespace std;
stack <int> a; //建立一个栈
int main () //栈的基本使用方法
{
int c, b, n;
scanf ("%d %d %d", &c, &b, &n);
a.push (c); //进栈
a.push (b);
a.push (n);
cout << a.top () << " "; //输出栈顶元素
a.pop (); //出栈
cout << a.top () << " ";
a.pop ();
cout << a.top () << " ";
}
真不错;
B进度:
总之就是恶补各种以前学过的算法
我这里只给张表,自己看着复习哈 (不负责任地说)
- 函数:学会自定义函数,分清实参与形参
- 结构体:学会定义结构体,并会写相关排序的cmp函数
- 常用技巧:快速幂,辗转相除,埃氏筛
- 高精度:背多分
- 位运算:学会善用,巧用位运算,了解其原理
- 贪心:有这思想就行,注意Johnson算法
- 递推:找规律,总结递推式与初始条件
啊,肝了两个小时……总算是有个结尾啊
我可能写的有点逊,请见谅。