算法入门经典 例题 1-1
算法入门经典 例题 1-1好的,从今天开始,我将学习刘汝佳老师的《算法竞赛入门经典》,以便冲刺今年九月份的 CSP-J。 题目输入底面半径 r 和高 h,输出圆柱体的表面积,保留3位小数。 样例输入:13.5 9 样例输出:1Area = 274.889 解答由于题目过于简单,上过小学的人都会逻辑,所以没有分析。 初版解答1234567891011121314151617181920#include <iostream>using namespace std;float area(r,h){ int s; s = 2 * pi * r ** 2 + 2 * pi * r * h; return s;}int main(){ int r,h,a; cin >> r >> h; a = area(r,h); cout << "Area = " << a; return...
STL
STLSTL(Standard Template Library,标准模板库)是 C++ 标准库的一部分,提供了一组通用的、可重用的模板类和算法,用于处理常见的数据结构和操作。STL 通过提供高效、抽象和灵活的代码,使开发者能够更快速地实现常见的数据操作,而无需从头开始编写底层实现。 STL 的核心包括三部分: 容器(Containers):用于存储和管理数据的对象。 算法(Algorithms):用于操作容器数据的函数。 迭代器(Iterators):用于遍历容器的对象,类似于指针。 函数对象(Function Objects):即可调用的对象,通常与算法结合使用。 STL 的主要组成部分:1. 容器(Containers)容器是用于存储数据的对象,它们通过提供不同的结构(如数组、链表、哈希表等)来管理数据。STL 提供了多种容器,主要分为以下几类: 顺序容器(Sequence...
Vector 向量
Vector 向量Vector 是一种动态数组,属于 STL 中的容器类之一,它提供了可以自动扩展大小的数组功能。与传统的数组不同,Vector 在需要时会自动调整大小,且支持快速访问、插入、删除等操作。 Vector 的特点: 动态大小:Vector 的大小是动态变化的,可以根据需要自动增长或缩小,避免了固定大小数组的限制。 按索引访问:可以像数组一样使用索引来访问 Vector 中的元素。 存储效率:Vector 会根据需要自动调整内部存储的大小,通常会预留一些额外空间来减少频繁的内存重新分配。 随机访问:支持快速随机访问,时间复杂度为 O(1),就像数组一样。 支持常见操作:Vector 提供了许多常见的操作,如插入、删除、查找、排序等。 Vector 的优点: 灵活性:不需要事先知道容器的大小,可以动态调整。 效率:与数组相比,Vector 在元素插入和删除时表现更好,尤其是插入到末尾时。 内存管理:Vector 会根据需要自动调整内部容量,减少了内存浪费。 Vector 的缺点: 在中间插入和删除效率低:虽然插入和删除操作通常很高效,但在 Vector...
二叉树 Binary Tree
二叉树 Binary Tree二叉树是一种每个节点最多有两个子节点的树形数据结构。它是一种广泛应用于计算机科学中的数据结构,常用于表达层次结构、实现查找、排序、表达式求值等任务。 二叉树的基本定义: 节点:二叉树中的每个元素,通常包含数据和指向其子节点的指针。 根节点(Root):二叉树的第一个节点,是树的起点。 子节点(Children):每个节点可以有最多两个子节点,分别是左子节点和右子节点。 叶节点(Leaf):没有任何子节点的节点,也叫终端节点。 父节点(Parent):指向某一节点的上级节点。 深度(Depth):从根节点到该节点的路径长度。 高度(Height):从该节点到最远叶子节点的路径长度。 二叉树的基本类型 满二叉树(Full Binary Tree): 每个节点要么没有子节点,要么有两个 子节点。 即,除了叶节点外,其他每个节点都有两个子节点。 完全二叉树(Complete Binary Tree): 除了最后一层外,每一层的节点都尽可能多,且最后一层的节点都集中在左侧。 平衡二叉树(Balanced Binary...
哈希表 Hash Table
哈希表 Hash Table哈希表(Hash Table)是一种用于存储键值对(key-value pairs)的数据结构,它可以实现非常高效的查找、插入和删除操作。哈希表通过哈希函数将键映射到哈希表的索引位置,从而能在常数时间 O(1) 内完成查找、插入和删除操作。 哈希表的基本原理 哈希函数:哈希表通过哈希函数将键(key)映射到哈希表中的一个特定位置(即索引)。哈希函数的目标是尽可能将不同的键映射到不同的索引,以减少冲突。 哈希函数的一种常见实现方法是:hash(key) = key % table_size,这里的 table_size 是哈希表的大小。 冲突(Collision):不同的键可能通过哈希函数计算后得到相同的哈希值,从而映射到同一个位置,这时就发生了冲突。解决冲突的常见方法有: 链式地址法(Separate Chaining):每个哈希表的槽位(bucket)存储一个链表,冲突的元素存储在同一个链表中。 开放定址法(Open Addressing):当发生冲突时,哈希表会尝试在表中寻找其他空位,直到找到一个空槽。 负载因子(Load...
数组 array
数组 array数组的特点: 固定大小:数组在创建时必须指定大小,一旦定义,大小不能更改。这意味着,如果需要存储更多的数据,必须创建一个新的数组并复制数据。 元素类型相同:数组中的所有元素必须是相同类型的数据(如整数、字符、浮点数等)。 按索引访问:数组的每个元素都有一个唯一的索引,索引从0开始,允许直接访问任何元素。 连续内存:数组的元素在内存中是连续存储的,这使得数组具有较快的访问速度。 数组的缺点: 固定大小:数组一旦创建,其大小是固定的,无法动态扩展。如果数据量超出了原先设定的大小,必须重新分配更大的数组并复制数据,效率较低。 浪费内存:如果你事先定义的数组大小过大,可能会浪费内存空间;如果大小过小,可能会导致无法存储所有数据。 插入和删除效率低:数组中的元素是连续存储的,因此在数组中间插入或删除元素时,需要移动大量的数据,效率较低。 示例(C++):12345678910111213141516171819#include <iostream>using namespace std;int main() { //...
栈 Stack
栈 Stack栈(Stack)是一种线性数据结构,它遵循“后进先出”(LIFO,Last In First Out)原则,即最后加入的元素最先被取出。栈通常用于实现需要“反向”操作的算法和数据结构。 栈的特点: 后进先出(LIFO):栈的访问顺序遵循后进先出的原则,最后插入的元素最先被移除。 操作限制:栈只允许在一端进行插入和删除操作,这一端通常被称为栈顶(Top)。 动态增长:栈可以根据需要动态地扩展或收缩(对于动态数组实现的栈)。 存储结构:栈可以使用数组或链表来实现。 栈的常见操作: push:将一个元素添加到栈顶。 pop:移除栈顶元素,并返回该元素的值。 peek(或...
链表 Linked List
链表 Linked List链表是一种线性数据结构,它由多个节点(Node)组成,每个节点包含两部分: 数据部分:存储实际的数据。 指针部分:存储指向下一个节点的地址。 链表的结构特点是节点在内存中不一定是连续存储的,而是通过指针将一个个节点连接起来。每个节点可以通过指针找到下一个节点,形成一个链式结构。 链表的类型: 单向链表(Singly Linked List):每个节点只包含指向下一个节点的指针,最后一个节点的指针指向 null。 双向链表(Doubly Linked List):每个节点包含两个指针,分别指向前一个节点和下一个节点,便于从两端遍历。 循环链表(Circular Linked...
队列 Queue
队列 Queue队列(Queue)是一种线性数据结构,它遵循“先进先出”(FIFO,First In First Out)原则,即第一个进入队列的元素将是第一个被移除的元素。队列的结构像排队的人群,先到的人先得到服务。 队列的特点: 先进先出(FIFO):队列的访问顺序遵循先进先出的原则,最先加入的元素最先被移除。 操作限制:队列只允许在一端进行插入操作(称为队尾),只允许在另一端进行删除操作(称为队头)。 存储结构:队列可以使用数组或链表来实现。 队列的常见操作: enqueue(入队):将元素加入到队列的尾部。 dequeue(出队):从队列的头部移除元素,并返回该元素的值。 peek(或...
算法题类型
算法题类型1....