Day 1. 分治算法入门

一、分治法概述

分治法的设计思想

对于一个规模为 n n n的问题:若该问题可以容易地解决(比如说规模 n n n较小)则直接解决,否则将其分解为 k k k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

这种算法设计策略叫做分治法

分治法所能解决的问题一般具有以下几个特征:

  • (1) 该问题的规模缩小到一定的程度就可以容易地解决。

  • (2) 该问题可以分解为若干个规模较小的相同问题。

  • (3) 利用该问题分解出的子问题的解可以合并为该问题的解。

  • (4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

分治法的求解过程

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。

  • 求解子问题:若子问题规模较小而容易被解决则直接求解,否则递归地求解各个子问题。

  • 合并:将各个子问题的解合并为原问题的解。

例题A. 循环比赛

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

在修罗王和邪狼亡命天涯的同时,魔法学院一年一度的运动会正开的如火如荼。赛场上,业余评论员墨老师正在给观众做激情解说:“鬣狗群……咬住!咬住!鬣狗头子立功了!不要给斑马任何的机会!伟大的鬣狗!伟大的鬣狗头子!它继承了猛兽光荣的历史和传统!豹子、老虎、雄狮在这一刻灵魂附体!”

呃,这个,我们不要管那些场上选手的绰号了,现在的问题是有某个项目的 n n n个选手进行循环比赛,其中 n = 2 m n=2^{m} n=2m,要求每名选手要与其他 n - 1 n-1 n-1名选手都赛一次。每名选手每天比赛一次,循环赛共进行 n - 1 n-1 n-1天,要求每天没有选手轮空。比赛时间表格如图所示(假定 m = 3 m=3 m=3)。

  • 输入格式

输入为一个整数 m ( m ≤ 5 ) m(m≤5) m(m≤5)。

  • 输出格式

输出为 n n n行 n n n列的整型矩阵,即比赛表格。每个元素之间由空格隔开,行末无多余空格。(注意:无需文件输入输出!)

  • 样例

样例输入

2

样例输出

1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
  • 提交

Link

题解部分

思路

通过样例,我们可以发现规律:

(如图),每一个(除边长为 1 1 1的)正方形都可以分成 4 4 4个完全相同的小正方形。

每一个小正方形也可以继续分下去,直到边长为 1 1 1为止。

digui函数

参数

digui函数有4个参数:

  1. 该小正方形左上角的 x x x坐标
  2. 该小正方形左上角的 y y y坐标
  3. 该小正方形的阶数
  4. 该小正方形左上角的数值
函数体
  1. 定义变量 t t t,为小正方形的边长个数
  2. 特判:如果小正方形的阶数为 0 0 0( t t t的值为 1 1 1),保存其值,结束函数。
  3. 分别递归 4 4 4个小正方形。
核心代码
void digui (int x, int y, int len, int z) {int t = pow (2, len);if (len == 0) {a[x][y] = z;return;}digui (x, y, len - 1, z);digui (x + t / 2, y + t / 2, len - 1, z);digui (x, y + t / 2, len - 1, z + t / 2);digui (x + t / 2, y, len - 1, z + t / 2);
}

二、快速排序(quick_sort)

简介

先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之,直到每一个待处理的序列的长度为1, 处理结束。

图解

样例数据:6 1 2 7 9 3 4 5 10 8

递归树

样例数据:6 1 2 7 9 3 4 5 10 8

核心代码

void quick_sort (int left, int right) {int i, j, temp;if (left > right) {return;}temp = a[left];i = left, j = right;while (i != j) {while (a[j] >= temp && i < j) {j --;}while (a[i] <= temp && i < j) {i ++;}if (i < j) {swap (a[i], a[j]);}}a[left] = a[i];a[i] = temp;quick_sort (left, i - 1);quick_sort (i + 1, right);
}

例题B. 快速排序

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较

对 n n n个数使用快速排序进行从小到大排序

  • 输入格式

两行 第一行1个数 n ( 1 ≤ n ≤ 300000 ) n(1 \leq n \leq 300000) n(1≤n≤300000)第二行为 n n n个int范围内的整数,用空格隔开

  • 输出格式

从小到大排序之后的 n n n个数

  • 样例

样例输入

5
6 9 4 1 5

样例输出

1 4 5 6 9
  • 数据范围与提示
  1. 利用二分归并排序算法(分治);
  2. 注意结果可能超过int的范围,需要用long long存储。
  • 提交

Link

题解部分

上文

练习A. 第k小数1

Link OJ#2601

练习B. 第k小数2

Link OJ#2602

三、二路归并排序Merge_Sort

简介

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

图解&递归树

样例数据:2 4 7 5 8 1 3 6

核心代码

void merge_sort (int left, int right) {//分 if (left == right) {return;}int mid = (left + right) / 2;merge_sort (left, mid);merge_sort (mid + 1, right);//合 int i = left, j = mid + 1, k = left;while (i <= mid && j <= right) {if (a[i] <= a[j]) {t[k ++] = a[i ++];} else {t[k ++] = a[j ++];}}while (i <= mid) {t[k ++] = a[i ++];}while (j <= right) {t[k ++] = a[j ++];}for (i = left; i <= right; i ++) {a[i] = t[i];}
}

例题C. 归并排序

内存限制:64 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

归并排序号称是 O ( n log ⁡ n ) O(n \log n) O(nlogn)的时间复杂度,理论上说与快排是一样的快。但真的很快吗,请大家试一试。 这是一个测试归并排序算法正确性的题,没有别的意义。

  • 输入格式

第 1 1 1行: 1 1 1个整数 N ( 1 ≤ N ≤ 100000 ) N(1 \leq N \leq 100000) N(1≤N≤100000)表示排序元素的个数。

第 2 2 2行: N N N个用空格分开的整数,每个数都小于 50000 50000 50000

  • 输出格式

仅 1 1 1行: N N N个从小到大排序的数字。数字之间用 1 1 1个空格分开。

  • 样例

样例输入

5
1 3 2 4 0

样例输出

0 1 2 3 4
  • 提交

Link

题解部分

上文

练习C. 求逆序对数

Link OJ#2628

练习D. 查找最大和次大元素

Link OJ contest-22/01/23

练习E. 一次查找两元素

Link OJ#2629

Day 2. 二分算法

例题D. 寻找伪币

内存限制:128 MiB 时间限制:1000 ms 标准输入输出题目类型:传统 评测方式:文本比较
  • 题目描述

给你一个装有 16 16 16枚硬币的袋子。 16 16 16枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这枚伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,比如天平。利用这台仪器,可以知道两组硬币的重量是否相同。(注意:必须用分治做!)

  • 输入格式

一行,包含 16 16 16个正整数,用空格隔开,每个正整数不大于 10 10 10, 其中 15 15 15个数相同, 1 1 1个数小于其它 15 15 15个数

  • 输出格式

一行,两个数,用空格隔开 第一个数是伪币的输入编号,第二个数是伪币的重量

  • 样例

样例输入

2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2

样例输出

4 1
  • 提交

Link

题解部分

对于查找最小元素,有以下三种情况。

方法a

任意取 1 1 1枚硬币,与其他硬币进行比较,若发现轻者,这枚为伪币。最多可能有 15 15 15次比较。

最坏时间复杂度: O ( n ) O(n) O(n)

方法b

把硬币分为 8 8 8组,每组 2 2 2个,每组比较一次,若发现轻的,则为伪币。最多可能有 8 8 8次比较

最坏时间复杂度: O ( n 2 ) O(\frac{n}{2}) O(2n​)

方法c

最坏时间复杂度: O ( log ⁡ n ) O(\log n) O(logn)

分析

上述三种方法,分别需要比较 15 15 15次, 8 8 8次和 4 4 4次,那么形成比较次数差异的根本原因是什么?

方法a: 每枚硬币都至少进行了一次比较,而有一枚硬币进行了 15 15 15次比较。

方法b: 每一枚硬币只进行了 1 1 1次比较。

方法c: 将硬币分成两组后一次比较可以将硬币的范围缩小到原来的一半,这样充分利用了只有 1 1 1枚伪币的性质。

核心代码

int l = 1, r = 16, suml, sumr;
while (l < r) {int mid = (l + r) / 2;suml = p[mid] - p[l - 1], sumr = p[r] - p[mid];if (suml < sumr) {r = mid;} else {l = mid + 1;}
}

练习F. 折半查找法

Link OJ#2616

练习G. 二分查找

Link OJ#8154

练习H. 数的查找

Link OJ#3790

例题E. 查找最接近的元素

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

在一个非降序列中,查找与给定值最接近的元素。

  • 输入格式

第一行包含一个整数 n ( 1 ≤ n ≤ 100000 ) n(1 \leq n \leq 100000) n(1≤n≤100000),为非降序列长度。

第二行包含 n n n个整数,为非降序列各元素。所有元素的大小均在 0 0 0~ 1 0 9 10^{9} 109之间。

第三行包含一个整数 m ( 1 ≤ m ≤ 10000 ) m(1 \leq m \leq 10000) m(1≤m≤10000),为要询问的给定值个数。

接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在 0 0 0~ 1 0 9 10^{9} 109之间。

  • 输出格式

m m m行,每行一个整数,为最接近相应给定值的元素值,保持输入顺序。若有多个值满足条件,输出最小的一个。

  • 样例

样例输入

3
2 5 8
2
10
5

样例输出

8
5
  • 提交

Link

题解部分

本例题是利用二分查找区间中的点与 x x x的大小。如果相等,直接返回这个元素的值。

在查找过程中,我们需要保持 a i ≤ x a_i \leq x ai​≤x, a r ≥ x a_r \geq x ar​≥x这个条件不变。

如果 a m i d a_mid am​id小于 x x x,则可能查找的范围是 [ m i d + 1 , r ] [mid+1,r] [mid+1,r],但是 a m i d + 1 a_mid+1 am​id+1的值可能大于 x x x,因此把 l l l更新成 m i d mid mid。

如果 a m i d a_mid am​id大于 x x x,则可能查找的范围是 [ l , m i d − 1 ] [l,mid-1] [l,mid−1],但是 a m i d − 1 a_mid-1 am​id−1的值可能小于 x x x,因此把 r r r更新成 m i d mid mid。

因为最终的答案一定是有效的下标,所以出事查找的范围可以设为 [ 1 , n ] [1,n] [1,n]。

当 x x x小于 a 1 a_1 a1​时,会一直减小 r r r,直到区间失效,此时 l , r l,r l,r指向的均为有效下标,可以比较对应的值。

当 x x x大于 a n a_n an​时,会一直增大 l l l,直到区间失效,与上面同理。

核心代码

int find (int l, int r, int x) {while (l + 1 < r) {int mid = (l + r) / 2;if (a[mid] < x) l = mid;else if (a[mid] > x) r = mid;else return mid;}if (x - a[l] <= a[r] - x) {return l;} else {return r;}
}

例题F. 二分查找下界

内存限制:256 MiB 时间限制:1000 ms 标准输入输出题目类型:传统 评测方式:文本比较
  • 题目描述

在一个 N N N个元素的不递减数列中,查找大于或等于 X X X的第一个位置,如果找不到则输出 n + 1 n+1 n+1。下标范围从 1 N 1~N 1 N。

  • 输入格式

共 3 3 3行

第一行一个 n ( 1 ≤ n ≤ 100 ) n (1 \leq n \leq 100) n(1≤n≤100)

第二行n个不递减的整数

第三行查找目标数 x x x

数据都在int范围内

  • 输出格式

第一个大于等于 x x x的数的下标,没有则输出 n + 1 n+1 n+1

  • 样例

样例输入1

5
1 3 3 3 4
3

样例输出1

2

样例输入2

5
1 3 3 3 4
8

样例输出2

6
  • 提交

Link

题解部分

从样例可以得出: 我们要周全考虑 x x x在数列中各种可能出现的位置。甚至在左右边界之外的情况。

  1. 如果在数列中有连续的一段 x x x,那么找到a[mid] == x时还不能停下来,还得继续在左侧查找,即向左逼近答案,此时更新右端点: r = mid;

  2. 如果a[mid] > x时,显然需要更新右端点: r = mid;

  3. 如果a[mid] < x时,更新左端点: l = mid;

l + 1 == r时,即左右断点相邻,退出循环。

核心代码

int lower_bound (int n, int x) {int l = 0, r = n + 1, mid;while (l + 1 < r) {mid = (l + r) / 2;if (a[mid] >= x) {r = mid;} else {l = mid;}}return r;
}

练习H. 二分查找上界

Link OJ#11090

总结

通过前面几个例子,我们可以知道具有什么特征的题目适合二分?

  1. 初始时有上下界
  2. 答案在其中
  3. 序列具有单调性

Day 3. 二分算法练习(一)

例题G. 二分法求函数的零点

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

有函数:
f ( x ) = x 5 − 15 x 4 + 85 x 3 − 225 x 2 + 274 x − 121 f(x)=x^{5}-15x^{4}+85x^{3}-225x^{2}+274x-121 f(x)=x5−15x4+85x3−225x2+274x−121
。已知 f ( 1.5 ) > 0 , f ( 2.4 ) < 0 f(1.5)>0,f(2.4)<0 f(1.5)>0,f(2.4)<0 , 且方程 f ( x ) = 0 f(x)=0 f(x)=0在区间 [ 1.5 , 2.4 ] [1.5,2.4] [1.5,2.4]有且只有一个根,请用二分法求出该根。

  • 输入格式

无。

  • 输出格式

该方程在区间 [ 1.5 , 2.4 ] [1.5,2.4] [1.5,2.4]中的根。要求四舍五入到小数点后 6 6 6位。

  • 样例

样例输入

样例输出

不提供
  • 提交

Link

题解部分

1. check函数

check函数就是把公式翻译成C++代码。
f ( x ) = x 5 − 15 x 4 + 85 x 3 − 225 x 2 + 274 x − 121 f(x)=x^{5}-15x^{4}+85x^{3}-225x^{2}+274x-121 f(x)=x5−15x4+85x3−225x2+274x−121

:函数的返回类型为double

double check (double x) {return x * x * x * x * x - 15 * x * x * x * x + 85 * x * x * x - 225 * x * x + 274 * x - 121;
}

2.二分内容

  1. 题目中已给出区间 [ 1.5 , 2.4 ] [1.5,2.4] [1.5,2.4],即

double l = 1.5, r = 2.4;

2.二分查找it

: 注意精度:1e-6(保留6位小数)

核心代码

if (check (mid) > -0.000001 && check (mid) < 0.000001) {printf ("%.6lf", mid);return 0;
} else if (check (mid) > 0.000001) {l = mid;
} else {r = mid;
}

练习I. 一元三次方程求解

Link OJ#3191

练习J. 和为给定数

Link OJ#473

Day 4. 二分算法练习(二)

例题H. 网线主管

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一起,即将它们全部连到一个单一的中心服务器。为了组织这个完全公正的比赛,裁判委员会主席提出要将所有选手的电脑等距离地围绕在服务器周围放置。

为购买网线,裁判委员会联系了当地的一个网络解决方案提供商,要求能够提供一定数量的等长网线。裁判委员会希望网线越长越好,这样选手们之间的距离可以尽可能远一些。

该公司的网线主管承接了这个任务。他知道库存中每条网线的长度(精确到厘米),并且只要告诉他所需的网线长度(精确到厘米),他都能够完成对网线的切割工作。但是,这次,所需的网线长度并不知道,这让网线主管不知所措。

你需要编写一个程序,帮助网线主管确定一个最长的网线长度,并且按此长度对库存中的网线进行切割,能够得到指定数量的网线。

  • 输入格式

第一行包含两个整数 N N N和 K K K,以单个空格隔开。 N ( 1 ≤ N ≤ 10000 ) N(1 \leq N \leq 10000) N(1≤N≤10000)是库存中的网线数, K ( 1 ≤ K ≤ 10000 ) K(1 \leq K \leq 10000) K(1≤K≤10000)是需要的网线数量。

接下来N行,每行一个数,为库存中每条网线的长度(单位:米)。所有网线的长度至少1m,至多100km。输入中的所有长度都精确到厘米,即保留到小数点后两位。

  • 输出格式

网线主管能够从库存的网线中切出指定数量的网线的最长长度(单位:米)。必须精确到厘米,即保留到小数点后两位。

若无法得到长度至少为1cm的指定数量的网线,则必须输出0.00(不包含引号)。

  • 样例

样例输入

4 11
8.02
7.43
4.57
5.39

样例输出

2.00
  • 提交

Link

题解部分

首先定义两个整数 n n n和 k k k,表示网线的数量和需要的截数。

再定义一个整型数组 a a a,表示每根网线的长度(不定义浮点数是因为避免精度误差)。

check 函数

定义整型函数check,统计截数。

: 计算截数时,暴力枚举每一段线可分出的截数,注意计算时用取整除

二分内容

1.lr的初值

l l l的初值为 1 1 1(单位:cm), r r r的初值为所有长度的最大值。

2.while循环
  1. 条件: l < r

  2. m i d mid mid的赋值: mid = (l + r + 1) / 2;

  3. 改变 l ( r ) l(r) l(r)的条件:

if (check (mid) < k) {r = mid - 1;
} else {l = mid;
}

输出

check(l)>= k,即当前有解,则输出答案。

: l l l应除以 100.0 100.0 100.0。

否则,输出0.00

核心代码

while (l < r) {mid = (l + r + 1) / 2;if (check (mid) < k) {r = mid - 1;} else {l = mid;}
}

练习K. 月度开销

Link OJ#479


学完分治算法,总结如下

  1. 分治,意为"分而治之"。主要步骤: 分 → 治 → 合。
  2. 二分算法,主要理清楚四个问题。(1)分什么 (2)怎么分 (3)求什么 (4)怎么求。
  3. 有必要时,写check函数。

Day 5. STL 之 队列(queue)

队列(Queue)一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许删除的一端称为队尾(Rear),允许插入的一端称为队头 (Front),如图所示:

请先用一个数组,来模拟队列的功能。

例题I. 队列及其操作

内存限制:128 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
  • 题目描述

队列(queue):在线性表的一端插入元素,在另一端删除元素,所以遵循先进先出( FIFO)原则,元素从队尾进,队首出,不允许插队!

其中删除元素的一端称为队首(front),插入元素的一端称为队尾(rear)。

队列就像我们排队打饭,先来的先打饭,后来的只能排在队尾。

  • 输入格式

第1行包含一个整数 ,表示有 条关于 queue 的操作,在进行任何操作之前,queue 都是空的。接来的 行,每行是一个关于 queue 的操作,格式和含义如下:
clear:把队列置空。

empty:判断队列是否为空。

push:把整数 x x x 插入队尾( x x x 为 int 范围里的数)。

pop: 队首元素出队列。

front:获取队首元素的值。

  • 输出格式

对于 front 操作,输出一个整数,如果这个操作失败,则输出单词 error

对于 pop 操作,如果这个操作失败,则输出单词 error

对于 empty 操作,如果队列是空,则输出empty,否则输出 not empty

  • 样例

输入样例

A.in

8
push 10
front
push 15
pop
front
clear
front
pop

输出样例

A.out

10
15
error
error
  • 数据范围与提示

n ≤ 20000 n \leq 20000 n≤20000

  • 提交

Link

题解部分

这道题目是一道模拟题,只需要写出五种语句的函数即可。

empty函数

判断frontrear是否相等即可。

bool empty () {return front == rear;
}

push函数

该函数就是将该“队列”加上一个数,只需rear自加1,再赋值即可。

void push (int n) {a[++ rear] = n;
}

front函数

首先要判断是否为空 (利用empty) 。

若“队列”为空,输出error;否则,输出队首元素。

void Front () {//为了与变量front相区分,将F大写if (empty ()) {printf ("error\n");} else {printf ("%d\n", a[front + 1]);}
}

pop函数

首先要判断是否为空 (利用empty) 。

若“队列”为空,输出error;否则,front自加1。

void pop () {if (empty ()) {printf ("error\n");} else {front ++;}
}

clear函数

只需让frontrear都为0即可。

void clear () {front = rear = 0;
}

queue的用法及功能

  1. 头文件:

#include <queue>

  1. 定义方式

queue < 类型名 > 变量名, ...;

eg. queue < int > q1, q2;

  1. 常用操作

(1) q.empty ()

判断是否为空。即若队列q为空则返回true,否则返回false

(2) q.size ()

返回队列q中元素的个数。

(3) q.pop ()

删除队列q的首元素。

(4) q.front ()

返回队列q的首元素的值。

(5) q.push (x)

在队列q尾处压入新元素 , x x x为要压入的元素。

(6) q.back ()

返回队列q的尾元素的值。

练习L. 周末舞会

Link OJ#448

练习M. Blah 数集

Link OJ contest-22/01/27

练习N. 取牌游戏

Link OJ#449

练习O. 海港

Link OJ#455

Day 6. STL 之 栈(stack)

栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:

例题J. 栈的基本操作

内存限制:128 MiB 时间限制:1000 ms 输入文件:A.in 输出文件:A.out
题目类型:传统 评测方式:文本比较
  • 题目描述

栈:插入元素和删除元素只能在线性表的一端进行,所以遵循“先进后出 (LIFO) 原则,其中插入和删除的一端称为栈顶 (top)。我们可以把栈比喻成一个箱子,只能在箱子的开口处放入和取出物体,而且是后放入的物体,会被先取出来。

  • 输入格式

第 1 行一个整数 ,表示有 条关于 的操作,在进行任何操作之前, 是空的。接来的 行,每行 一个关于 的操作,格式和含义如下:

clear:把栈置空。

empty:判断栈是否为空。

push(x):把整数 x 插入栈顶。

pop: 栈顶元素出栈。

top :获取栈顶元素的值。

  • 输出格式

若干行,对应输入中的 top, popempty 操作:

对于 top 操作,输出一个整数,如果这个操作失败,则输出单词 error

对于 pop 操作,如果这个操作失败,则输出单词 error

对于 empty 操作,如果栈是空,则输出 empty,否则输出 not empty

  • 样例

样例输入

8
push 10
top
push 15
pop
top
clear
pop
empty

样例输出

10
10
error
empty
  • 数据范围与提示

n ≤ 20000 n \leq 20000 n≤20000

x x x 是int范围内的整数

  • 提交

Link

题解部分

这道题目是一道模拟题,只需要写出五种语句的函数即可。

clear函数

只需让t(top)置为0即可。

void clear () {t = 0;
}

empty函数

判断t是否为0即可。

bool empty () {return t == 0;
}

push函数

该函数就是将该“栈”加上一个数,只需t自加1,再赋值即可。

void push (int x) {a[++ t] = x;
}

top函数

首先要判断是否为空 (利用empty) 。

若“栈”为空,输出error;否则,输出队首元素。

void top () {if (empty ()) {printf ("error\n");} else {printf ("%d\n", a[t]);}
}

pop函数

首先要判断是否为空 (利用empty) 。

若“栈”为空,输出error;否则,t自减1。

void pop () {if (empty ()) {printf ("error\n");} else {t --;}
}

stack的用法及功能

  1. 头文件:

#include <stack>

  1. 定义方式

stack < 类型名 > 变量名, ...;

eg. stack < int > s1, s2;

  1. 常用操作

(1) s.empty ()

判断是否为空。即若栈s为空则返回true,否则返回false

(2) s.size ()

返回栈s中元素的个数。

(3) s.pop ()

删除栈s的首元素。

(4) s.top ()

返回栈s的栈顶元素的值。

(5) s.push (x)

在栈s顶处压入新元素 , x x x为要压入的元素。

练习P. 车站铁轨

Link OJ#6763

练习Q. 括号平衡

Link OJ#6764

练习R. 程序员输入问题

Link OJ#445

练习S. 溶液模拟器

Link OJ#446

练习T. 表达式求值

Link OJ#447

最后

以上就是“寒假集训总结 (1.23~1.28)”的所有内容了,

由于作者过年干饭去了,时间紧促,本帖中可能有疏忽错误之处,请各位大佬不吝指正!

也祝大家新年快乐!

------ Happy New Year!     2022 ------

寒假集训总结 (1.23~1.28) [第一梯队]相关推荐

  1. 2019NEFU寒假集训新生考试 2020.1.6

    2019NEFU寒假集训新生考试 2020.1.6 为期一周的的培训终于面临尾声,就以一场考试告终吧. A 28的因子 Description 我们都知道28的因子中含有4和7,而某些人偏爱数字4和7 ...

  2. 寒假集训三(暴力枚举)2020.01.02(11题)

    寒假集训三(暴力枚举)id :521 Problem:A 二倍的问题 Description 给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍.比如给 ...

  3. 2019寒假集训新生考试

    序言: 为期一周的欢乐的寒假集训终于结束了,很高兴能认识这么多的大佬和学长.学姐.很感谢ljw学长和陈宇老师为我们寒假培训所作出的贡献. 简单点评一下今天的考试试题,就在比赛前的中午,jlw学长说题目 ...

  4. 2019寒假集训新生考试 【持续更新中】

    2019寒假集训新生考试-NEFU 0107 emoji表情包 Problem A nefu 2101 28的因子 ⭐️ 本题使用暴力枚举,统计n可以分成几个4和7, 为了防止TLE ,先统计4的个数 ...

  5. 【软件创新实验室2021年寒假集训】Java后端开发漫谈及感悟分享

    系列文章目录 [软件创新实验室2021年寒假集训]汇总篇 20级Java培训 第一天:[软件创新实验室2021年寒假集训]Java技术培训--Java前置知识学习 第二天:Java基础(一) 第三天: ...

  6. 【软件创新实验室2021年寒假集训】Java技术培训——Java前置知识学习

    系列文章目录 [软件创新实验室2021年寒假集训]汇总篇 20级Java培训 第一天:[软件创新实验室2021年寒假集训]Java技术培训--Java前置知识学习 第二天:Java基础(一) 第三天: ...

  7. DP\记忆化搜索-牛客寒假集训营3-牛牛的DRB迷宫I

    DP-牛客寒假集训营3-牛牛的DRB迷宫I 题目: 题意: 求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--DP题型总结中的<摘花生>类似.中的< ...

  8. 构造-牛客寒假集训营3-牛牛的DRB迷宫II

    构造-牛客寒假集训营3-牛牛的DRB迷宫II 题目: 题意: 输入一个数字,表示从起点(1,1)到终点(n,m)的方案数量,输出满足条件的迷宫.输入一个数字,表示从起点(1,1)到终点(n,m)的方案 ...

  9. 关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训)

    关于构造和二进制,题目:牛牛的DRB迷宫Ⅱ(源自牛客竞赛2020年寒假集训) 题目: 链接:https://ac.nowcoder.com/acm/contest/3004/B 来源:牛客网 题目描述 ...

最新文章

  1. 宏定义来实现一个结构体成员相对于该结构体首地址的偏移量
  2. Python操作excel进行插入、删除行操作实例演示,利用xlwings库实现
  3. 使用vue来开发一个下拉菜单组件(1)
  4. 超越苹果! 雷军愿望达成:小米,世界第三!
  5. no system images installed for this target这个问题如何解决?
  6. PDA与服务器时间同步
  7. c语言程序设计订餐系统,C语言订餐系统
  8. 【TSP】基于matlab GUI免疫算法结合蚁群算法求解旅行商问题【含Matlab源码 1910期】
  9. linux开机密码取消,如何取消电脑开机密码
  10. excel学习-批量填充单元格
  11. FPGA写约束文件+固化+上板抓信号方法(vivado软件)
  12. 新时期文学专题研究【1】
  13. SpringCloud-Gateway网关
  14. Navicat执行sql文件没反应
  15. Python数据分析pandas入门练习题(七)
  16. 凌恩客户文章:16S全长鉴定癌症细胞组织特异性微生物谱
  17. css下拉菜单汇总案例
  18. osi七层语言html,OSI分为哪七层 OSI七层功能介绍【详解】
  19. 知道创宇研发技能表v3.0
  20. 大数据交易研究_学术著作 | 基于电商平台大数据的特征价格指数研究——统计研究...

热门文章

  1. CSS中zoom属性的作用
  2. ruby非阻塞式socket编程--写飞信客户端的经验总结
  3. 火山PC文件资源的读写教程
  4. Go-Excelize API源码阅读(十九)——SetHeaderFooter
  5. win11优化-集成PowerToys和Everything以实现mac的“聚焦”搜索
  6. ipad无法充电怎么办_ipad连接电脑显示不在充电怎么办 如何解决【图文详解】
  7. 串的模式匹配——KMP中next函数的计算
  8. ElasticSearch 动态映射和静态映射,以及四种字段类型
  9. JavaSE——为什么重写equals的同时一定要重写hashCode?
  10. 怀旧服服务器荣誉系统是啥,怀旧服荣誉系统上线第一天:互刷出现 第一批R10指日可待?...