
ACM心路
文章平均质量分 86
Deng笨蛋
路漫漫其修远兮,吾将上下而求索。
展开
-
ACM学习历程19——queue队列容器与priority_queue优先队列容器
Queue是一种实现了一个先进先出的线性表,它的插入操作只能在队尾进行,删除操作只能在队首进行,使用queue前需要需要加入头文件。queue容器的使用:(一)创建queue对象:queue类型>对象;queue q;(二)常用的queue操作:(1)back():读取队尾元素;(2)empty():如果队列空则返回真;(3)front():读取队首元素;(4)p原创 2016-08-27 19:47:49 · 667 阅读 · 0 评论 -
ACM学习历程28——利用数组下标
数组是在ACM程序设计大赛中经常用到的一类复合数据类型,对于一个数组类型的变量,我们可在变量声明的时候声明变量的类型,例如:整型数组、字符数组等。对于普通字符数组,其实是数组每个单元中存储了一个字符;对于字符串,实际上除了在每个存储位置存储了一个一个字符外,在字符串结束的位置还额外存储了一个’\0’作为字符串借书的标志。在这篇博文中,并不介绍数组在存储上的一些特性,只是想说明在解答题目的过程中,若是原创 2016-09-12 22:49:14 · 1049 阅读 · 0 评论 -
ACM学习历程6——Vector向量容器
Vector向量容器属于第一类容器,支持级访问迭代器,与数组不同的是,向量容器在内存用尽时,会自动分配更大的连续内存区,将原来的元素复制到性的内存区中,并释放旧的内存区。Vector实际上相当于一个动态的数组,随机访问的时间为常数,在尾部添加速度很快,但是在中间插入元素时速度会变慢,这一点跟对数组的操作是一样的,中间插值会设计到数据的移动。(一)在定义Vecotr时,需要给定一个具体的实参类型原创 2016-08-23 15:07:00 · 1056 阅读 · 0 评论 -
ACM学习历程9——string基本字符系列容器
在C++中string提供了字符串的添加、删除、替换、查找等丰富的算法,使用时是需要包含头文件即可,因此在需要存储字符串的情况和需要对字符串进行操作时可以考虑使用string类型的变量。下面对string的相关定义和主要操作如下:(一)定义:string s;此时s是一个空串,长度为0;(二)string类型变量的赋值:(1)直接赋值: string s; s=”hello w原创 2016-08-24 20:09:01 · 1539 阅读 · 1 评论 -
ACM学习历程10——set集合容器
Set集合容器,是一种实现了平衡二叉树的数据结构,容器中的数据不能重复,即每个数据都是唯一的,而且容器中的数据页数不能直接修改的,因为修改后的数据很可能不在原来的数位上。Set容器的主要目的是快速检索数据元素,减速时采用中序遍历,可将容器内数据由小到大遍历处理。需要注意的是,关联容器的迭代器不支持it+n操作,仅支持it++。Set容器的定义和使用方法如下:(一)Set容器的定义:se原创 2016-08-25 09:41:00 · 2402 阅读 · 0 评论 -
ACM学习历程11——Multiset集合容器的使用
Multise与Set的功能一样,不同的是multise允许插入重复的元素值,也就是说multise容器中的数据可以是不唯一的。Multise提供了许多可供操作的方法,使用时只需要添加头文件即可。Multise的使用:(一)添加元素:multiset s;s.insert(8);s.insert(10);s.insert(6);s.insert(8); 重复元素会插入到原创 2016-08-25 11:24:41 · 672 阅读 · 0 评论 -
ACM学习历程12——Map映照容器
Map映照容器是一种实现了平衡二叉树的数据结构,Map中每个元素都是一个键值对,且key值是不能重复的,即每个元素的key值都是唯一的。Map容器可以按key检索,使用时引入头文件即可。Map的定义和使用如下:(一)定义: map类型1,类型2>对象名;如:map m;其中,类型1是key的类型,类型2是value的类型。(二)添加元素:(1)方法一:map m原创 2016-08-25 14:52:11 · 473 阅读 · 0 评论 -
ACM学习历程13——multimap集合容器
Multimap与Map的功能一样,不同的是Multimap允许插入重复的值,即该集合容器中的数据可以不是唯一的。Multimap的定义和使用如下:(一)添加元素:multimap,int> m;m.insert(pair(“aa",1));m.insert(pair(“bb",2));m.insert(pair(“cc",3));m.insert(pair(“aa",4)原创 2016-08-25 15:27:27 · 428 阅读 · 0 评论 -
ACM学习历程14——deque双端队列容器
Deque双端队列容器与Vector向量容器相似,实现了随机访问、尾部插入和头部插入。不同的是deque采用分块的线性存储结构存储数据,此外,deque内部的数据数据机制和执行性能也与vector不同,在前面的博文中已经简述了vector的内存增长机制,因此若是考虑容器元素的内存分配策略和操作性能,deque相对于vector具有一定的优势。使用deque需要引入头文件。deque主要的方法如下:原创 2016-08-25 19:11:36 · 688 阅读 · 0 评论 -
ACM学习历程15——list双向链表容器
List容器是一种实现了双向链表的数据结构,它的每个节点都含有前驱元素指针域、数据域、后继元素指针域。不同于数组这样的线性表,由于list元素的前驱和后继都是靠指针来链接,因此在链表的任意位置进行元素的插入、删除和查找操作速度是较快的。由于list对象的结点并不要求在一段连续的内存中,所以对于迭代器,只能通过“++”或者“--”的操作,不能对其进行+N或者-N的操作。List含有丰富的操作,使用前原创 2016-08-25 21:18:15 · 892 阅读 · 0 评论 -
ACM学习历程16——List链表的应用之简单约瑟夫问题
约瑟夫问题是list链表的应用之一,问题描述:N个人围成一个圆圈,每个人都有唯一的一个编号,编号从1到N,从编号为1的人开始报数,依次报到K,报数为K的人出列,他的下一个又从1开始报数,直到所有的人都出列,求这个出列的序列。结合上一篇博客,这里使用list链表,给出一个可行的解答代码。注:n为人数,p为要报的数。#include#includeusing namespace std;原创 2016-08-25 21:42:58 · 1989 阅读 · 0 评论 -
ACM学习历程18——stack堆栈容器
Stack堆栈容器是一种实现了先进后出的线性表,它的插入和删除操作只能在栈顶实现。前面的博文中已经说过了,容器适配器包括:queue、stack、priority_queue这些适配器都是包装了vector、list、deque中某个顺序容器的包装器,将一些基础容器转换成自己的容器。值得注意的是,适配器没有提供迭代器,不能同时插入和删除多个元素。使用stack前需要引入头文件。(一)sta原创 2016-08-26 20:59:09 · 1184 阅读 · 0 评论 -
ACM学习历程29——搜索算法
搜索算法是利用计算机的高性能来有目的地穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。涉及到的概念包括:状态、状态转移、搜索树、状态空间、可行解、最优解。一、相关概念状态:对问题以及事物状态在某一发展阶段的数学描述。状态转移:问题从一种状态转移到另一种状态的操作。搜索树:以阶段中每一原创 2016-09-25 18:37:46 · 525 阅读 · 0 评论 -
ACM学习历程30——回溯算法
一、回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:1、定义一个解空间,它包含问题的解。2、利用适于搜索的方法组织解空间。3、利用深度优先法搜索解空间。4、利用限界函数避免移动到不可能产生解的子空间。二、回溯举例2.1皇后问题问题描述:在n×n格的原创 2016-09-25 19:46:08 · 1416 阅读 · 0 评论 -
ACM学习历程8——Vector应用
Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。Vector的方法有如下一些: 应用举例一:输入数据:含有不多于50个的正整数n(0),输出数:对于每个n计算其第n项fibonacci数,每个结果独占一行。输入:6原创 2016-08-23 21:18:44 · 579 阅读 · 0 评论 -
ACM学习历程7——Vector向量容量扩展机制
Vector向量容器相当于一个动态的数组,当向向量容器中不断加入元素,若超过容器本身的大小限制,vector会自动拓展大小,在这过程中涉及到内存的分配和回收。在vector中有size()和capacity()函数,与之相对应的两个函数resize(size_type)和reserve(size_type)。Size函数是指返回当前容器中的元素个数,对应的resize(size_type)会在容器原创 2016-08-23 16:14:17 · 1983 阅读 · 0 评论 -
ACM学习历程27——模式匹配
模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配,通常模式匹配算法可以通过以下方式求解。 一、BF朴素模式匹配 该算法思想主要依靠循环遍历比较,设目标串为S,模式串为T,在外层循环中变量i指向目标串的某个位置,在内层循环中变量j=i,k=0。从k和j的位置开始,若S[j]与T[k]相等则j和k同时向后移动,若k能移动到模式串的结原创 2016-09-02 12:53:20 · 974 阅读 · 0 评论 -
ACM学习历程20——竞赛中的简单数学问题之最大公约数、素数表、排列组合数
一、求解最大公约数和最小公倍数#includeusing namespace std;int main(){ int a,b,t; cin>>a>>b; t=a>b?a:b; for(;t>=1;t--) { if(a%t==0 && b%t==0) break; } cout<<"The greatest common divisor:"<<t<<endl;原创 2016-08-27 22:27:33 · 992 阅读 · 0 评论 -
ACM学习历程21——各种排列组合问题
在这篇博文中,介绍关于1—N和整型数组的排列算法,这些算法的主要用到了递归的思想,即在函数或子过程的内部直接或者间接调用自己的算法。递归算法解决问题的特点在于:递归本身就是在子过程或者函数里调用自身;在使用递归策略时,必须有一个明确的递归结束条件,也就是不存在死递归。当然递归的缺点也是明显的,递归算法虽然间接但是算法求解的运行效率较低。同时在递归调用的过程中系统为每一层的返回点、局部变量等开辟了栈原创 2016-08-28 20:19:55 · 4318 阅读 · 1 评论 -
ACM学习历程22——进制转换
一、十进制转N进制/* 函数功能:十进制数转换成N进制数*/#include#include#includeusing namespace std;//将十进制data转换成N进制string TransToN(int data,int n){ string result=""; int index=0,i,j,temp[64]; if(data==0) { r原创 2016-08-28 21:50:06 · 767 阅读 · 0 评论 -
常用排序算法汇总
这里主要涉及到的排序算法,包括冒泡排序、选择排序、直接插入排序、快速排序和哈希排序。这里先声明一下,下面的排序算法大多包含了三个输入参数:待排序的数组、数组的成员个数和flag标志,若flag的值为true则标志按照升序排列元素,flag为false则按照降序排列元素。 冒泡排序算法:#include<iostream>using namespace std;typedef int DataT原创 2016-08-18 16:29:38 · 520 阅读 · 0 评论 -
ACM学习历程23——最小周期串问题
最小周期串问题属于字符串操作的基本题型之一,要求给定一个字符串找出其中最小的周期长度和最小周期子串。对于周期串的定义如下:如果一个字符串是以一个或者一个以上的长度为K的重复字符串连接成的,那么这个字符串就叫做周期为K的串。找最小周期串的方法可以通过以下方式实现:一、从字符串的起始位置遍历,对于字符串长度为N的字符串,那么周期串的可能长度介于1—N之间,所以可以假设周期串的长度为i,其中1#原创 2016-08-30 19:31:07 · 3180 阅读 · 0 评论 -
ACM学习历程24——最大回文子串
回文串是指存在这样一种字符串,正读和反读所得到的结果都是一样的,例如1234321,无论正读和反读得到的都是一样的序列。最大回文子串问题是字符串操作的基本类型之一,求解字符串的最大回文字符串要求从一个字符串中找出存在的最大长度的回文子串。求解字符串的最大回文子串的思路有如下两种,当然不限于这两种方法,在后面将介绍其他算法思想。一、若字符串的长度为N,定义变量i和变量j,其中i的范围为0#i原创 2016-08-31 21:08:42 · 1063 阅读 · 0 评论 -
ACM学习历程1——输入输出语句
在ACM程序设计中通常使用C++语言作为程序的整体框架,主要原因:C++本身兼容了C,一方面它既保持了C的简洁、高效和接近汇编语言的特性,同时也对C类型系统进行了改进和扩充;另一方面,C++也支持面向过程的程序设计,当然它并不是一个纯正的面向对象的语言。此外C++提供了许多可以方面用户编程的工具和丰富的算法库,例如Algorithm库中包含了许多用户可以直接使用的排序、组合等算法,算法的设计人员可原创 2016-08-22 20:36:31 · 986 阅读 · 0 评论 -
ACM学习历程2——ACM题目中常用的输入输出方式
由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对编程者最基本的要求。(一)第一类输入:输入不说明有多少个Input Block,以EOF为结束标志。Example1:Calculate A + B .Input:Each line will contain two integers A and B . Process to原创 2016-08-22 20:39:29 · 14259 阅读 · 0 评论 -
ACM学习历程3——C与C++输入输出效率的问题
在上面一个博文中介绍了在算法设计大赛中会用到的各类输入输出形式,涉及到的主要语句是C中的scanf和printf以及C++中的cin和cout。事实上,在某些编程题中,有时会出现Time Limited的错误。当出现这种错误时,原因无非以下几种:程序中出现了死循环使得程序无法在规定的时间内完成;算法设计的过于复杂,使用了过多的循环使得程序步执行的次数过多;不合理语句的使用,包括输入输出语句等等原创 2016-08-22 20:54:32 · 1920 阅读 · 0 评论 -
ACM学习历程4——STL的使用
在算法设计大赛中,会使用一些语言本身提供的库,在这些库里面包含了大量已经实现了的数据结构或者算法,我们是需要在使用的过程中加入响应的头文件即可使用。标准模板库(Standard Template Library)是ANSI/ISO C++最有特色、最实用的部分之一。STL包含了容器类(container)、迭代器(iterator)和算法(algorithm)三个部分。泛型算法(generic原创 2016-08-22 21:00:59 · 756 阅读 · 0 评论 -
ACM学习历程25——高精度四则运算
在ACM的题目中会涉及到一些四则运算,需要注意的是这里参与四则运算的数据的数据类型并非整型。事实上,尽管整型可以分配4个字节的存储空间,但是它所能表示的数据范围仍然是有限的,所以在比赛上遇到加法等一些涉及四则运算的题目时,一定要留意最终结果或者中间结果是否会超出基本数据类型的表示范围。如果确定利用基本的数据类型确实会发生溢出问题,那么就要考虑使用数组来存储中间结果或者最终的运算结果。下面给出涉及到原创 2016-09-01 21:39:32 · 1836 阅读 · 1 评论 -
ACM学习历程5——算法设计中常用的函数
STL中有很多可以直接使用的算法,例如在和等头文件中定义了许多方法,这些方法只需要算法设计的过程中加入相应的头文件即可使用,下面介绍一些常用的算法。Sort排序,实际上是快速排序,可以对vector、string、数组等进行排序,缺省情况下sort是升序排列。#include#include#includeusing namespace std;int main(){ v原创 2016-08-23 15:02:54 · 1940 阅读 · 0 评论 -
ACM学习历程26——KMP算法
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的转载 2016-09-01 22:11:36 · 468 阅读 · 0 评论 -
ACM学习历程17——bitset位集合容器
Bitset容器是用来存放bit位元素的,每个元素只占1bit位,取值为0或者1,因而比较节约存储空间,bitset提供了多种方法操作位容器,使用前添加头文件即可使用。(一)创建bitset对象:bitset b,b为bitset对象,它能容纳1000个bit位,每个元素初值为0。注:bitset的大小定义时必须确定,并且定义后也不能修改。(二)设定元素的值:(1)下标法,b[原创 2016-08-26 20:05:37 · 1987 阅读 · 0 评论