算法与数据结构
T2777
这个作者很懒,什么都没留下…
展开
-
【c/c++】机试中的日期类问题2
首先 string.h 中的字符串指的是char 型字符数组的一些操作,而不是 c++ 中的string 型变量,关于它们的区别,我们以后再进行分析,scanf 对字符型数组 用 %s 表示从第一个不为空格的开始,到空格或者换行符,tab符号结束,在用 %s 时不必使用&取址操作。题目描述:大意为给1个日期,判断出该日期是星期几,并输出。输入数据的格式是:12 Octob...原创 2019-02-27 15:08:50 · 227 阅读 · 0 评论 -
链表
malloc和new都可以返回指针,对于链表的一些操作:#include<cstdio>#include<iostream>#include<stdlib.h>#include<algorithm>#include<functional>#include<queue>#include<string.h&...原创 2019-07-07 21:25:02 · 190 阅读 · 0 评论 -
c语言 水仙花数
水仙花数是一道比较简单的题目,即找出所有满足各位的立方之和为该三位数本身的三位数。代码为:#include<cstdio>#include<iostream>using namespace std;int main(){ int h, t, d; for(int n = 100; n < 1000; n++) { ...原创 2019-07-03 09:44:12 · 418 阅读 · 0 评论 -
【STL】 vector的基本操作
包括了push_back(),pop_back(),size(),clear(),insert(迭代器),erase(迭代器),erase(迭代器,尾元素的下一位迭代器)添加元素只能使用push_back(),而不能在初始时直接使用vi[0]= ? 来添加元素的方法。代码为:#include<cstdio>#include<iostream>#includ...原创 2019-07-03 10:37:42 · 145 阅读 · 0 评论 -
并查集和最小生成树问题的kruskal算法
并查集解决集合的合并问题,每一个结点有一个结点号,同时存储着一个指向其双亲结点的号码,每个集合都有一个根结点,根结点的双亲节点号为-1,表示无双亲,为了查询一个结点对应的集合的根结点,可以对查询过程实现优化,在查询过程中,使得每个扫描过的结点不再指向双亲结点,而把整个集合的根结点作为自己的双亲结点即可,这样以后的查询合并过程可以大大简化,合并是并查集的主要目的,找到两个集合的根结点,使得一个根结点...原创 2019-07-03 14:55:58 · 291 阅读 · 0 评论 -
最短路径问题(dj和floyd算法)
1. 首先是dj算法,dj算法的思想是从开始结点开始,每次找到距离开始结点距离最近的结点newP,加入到集合K中,表示已经访问过,然后遍历newP的直接相邻的结点,如果从newP结点开始到直接相邻的结点 i 的距离Dis[newP]+c < Dis[i],那么就更新Dis[i],扫描完成所有newP的邻接结点,然后遍历所有的结点,找到未访问过的并且Dis[i]最小的结点 j ,设为新的 ne...原创 2019-07-04 11:02:14 · 3144 阅读 · 0 评论 -
拓扑排序问题
拓扑排序是为了解决活动的先后问题,在满足拓扑排序的图中,任意一对结点<u,v>,总可以找到它们的顺序关系,例如u在v前,可能是直接,也可能是间接,思想就是建立一个有向无环图DAG,这样就可以满足结点的关系只有一种。题目:若A是B的老师,则B是A的学生,但是不能出现环,即A是B的老师,B是C的老师,C又是A的老师;甚至A和B互为老师也是不允许的。要求给出N个人,M个关系<x,y...原创 2019-07-04 15:14:49 · 629 阅读 · 0 评论 -
搜索问题:枚举法
枚举法只要暴力搜索就行,满足条件的直接进行输出:假设有 n 元,买100只鸡,鸡的价格分别为 5, 3, 1/3元。问可能买到的结果是:代码为:#include<cstdio>#include<iostream>using namespace std;int main(){ int n; while(scanf("%d", &...原创 2019-07-04 15:25:35 · 552 阅读 · 0 评论 -
BFS与DFS解决迷宫问题
1. 对于BFS,即广度优先搜索,要用到队列,每次从队首取元素,每次将队首的直接指向的结点放入队尾,直到搜索到最后的结果,与层序遍历完全一致。下面的题目,给出一个n*m的迷宫,起始结点S,终止结点T,判断是否能从S到达T,并输出路径长度。按照BFS的思想,将S压入队列,每次从队首取出一个结点,将从该结点出发的四个方向上未被访问过的结点压入队列,直到到达终止结点,并用一个结构体记录从S到达该...原创 2019-07-04 16:42:51 · 590 阅读 · 0 评论 -
递归问题(汉诺塔)
首先是汉诺塔问题,要求从A上将所有盘子移动到C上,要求所有的盘子只能大的在下,小的在上。思想是用递归的方法,设置一个中转站,将n个盘子放到C上,即将n-1个盘子移动到B上,再将最大的盘子移动到C上,再将n-1个盘子移动到C上,每一步都执行递归程序,出口是当 n 为1 时,直接从所在柱子移动到目标柱子即可。代码为:#include<cstdio>#include<io...原创 2019-07-04 18:13:26 · 155 阅读 · 0 评论 -
【leetcode】【数据结构】 二分查找法
上次刷LeetCode提到了二分查找法,但是最后没有用二分法实现,二分查找法是非常基础的算法,也比较容易掌握,这里对二分法进行一些总结。二分法一般要求这几点1. 已经排好序应当没有重复值,当有重复值时,下面的算法会出错误 2. 对一道复杂度为O( n )的题目进行优化,而二分法可以将时间复杂度降至 O( log n) 3.一般是找某个位置或某个数,如果是想插入一个,仅仅靠二分法不太...原创 2019-02-03 23:33:23 · 160 阅读 · 0 评论 -
stl中 map 的简单使用
map<char, int>, map<string ,int>都可以定义,但是不能用map<char[] ,int>这种char型数组,主要的几个操作是,map[a] = 1,用 iterator->first, iterator->second分来访问键与值,size(), clear(), find('a')返回迭代器,erase(it) ...原创 2019-08-18 21:46:29 · 150 阅读 · 0 评论 -
动态规划(poj):上楼梯问题的改进版
poj上机考试题目描述:D:上楼梯描述小S在玩一个叫上楼梯的游戏。楼梯一共有n层台阶。因为腿长的限制,小S每次最多只能上k层台阶。小S是一个迷信的人,所以他不希望自己某一步走的步数的数字里有"4",(比如4,14,44都含有数字"4")。现在,小S想要知道,有多少种走完这n层台阶的方案?输入输入包含多组数据。每组数据第一行输入一个整数 n, k(1 <...原创 2019-08-23 16:39:01 · 1215 阅读 · 0 评论 -
递归和分治问题
1. 输出字符串的全排列:采用递归的方式,交换两个字符,然后再输出打印:#include<bits/stdc++.h>using namespace std;void V(string s, int i, int n){ if(i == n - 1) { cout << s << endl; re...原创 2019-08-24 16:48:08 · 155 阅读 · 0 评论 -
绳子切割问题(枚举与二分)
绳子切割问题:给出N条绳子的长度,问按照一定长度 LG切割这几条绳子得到至少 k 条肠胃 LG 的绳子,问长度L最长为多少,保留2位小数。方法1:枚举法:绳子从0.01米开始增加,每次增加 0.01 米,直到 L[i] / LG之和小于k,则此时的LG - 0.01就是题目要求的答案:代码为:#include<cstdio>#include<iostream...原创 2019-08-21 20:31:35 · 1276 阅读 · 0 评论 -
动态规划之矩阵连乘问题
对于矩阵相乘来说, A1(p * q), A2(q * x), A3(x * y) 。。。连乘问题,(A1 * A2) * A3 与 A1 * (A2 * A3)的矩阵乘法的总次数是不同的,分别为 p* q * x + p * x * y 与 q * x * y + p * q * y,两者的值是不相等的,由此可知通过在矩阵连乘中添加括号,改变连乘的顺序可以得到最少的连乘次数。递推公式为:...原创 2019-08-17 16:40:38 · 394 阅读 · 0 评论 -
队列的简单c语言实现(链表式和循环队列)
对于队列来说,从队尾进,队尾出,要设置一个结点类型的指针q->front,和q->rear,q->front指向的结点是一个特殊的结点,不存放值,next指针域指向的是第一个有效的结点,实际上就是队首结点,而q->rear开始时与q->front相同,随着不断的入列,永远指向最后一个有效结点,q->rear->next为NULL,其它结点的next域不为N...原创 2019-05-12 20:33:10 · 1422 阅读 · 0 评论 -
[c++] string
c++中的string类和普通的字符串是不同的,但是实际上都是字符串,只不过string类默认减少了末尾\0的操作,而普通的char型数组的最后一位一定是这个,当然char s[10] = "hello",最后一位自动加上\0,而string类的size()操作默认是除了\0以外的字符总数。配合着stack,先来看一个例子:#include<iostream>#includ...原创 2019-05-20 13:35:48 · 511 阅读 · 0 评论 -
【c/c++】机试中的动态规划问题
动态规划问题(DP).1. 递推求解问题题目描述:N 阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归)输入:输入包括一个整数 N,(1<=N<90)。输出:可能有多组测试数据,对于每组数据,输出当楼梯阶数是 N 时的上楼方式个数。样例输入:4样例输出:5解题思路,当只有1层阶梯时只有1种上楼方式,2层阶梯...原创 2019-04-15 11:11:05 · 323 阅读 · 0 评论 -
【c/c++】 机试中的 hash 问题
先看一个问题:要求先输入数目 n , 再输入 n 个数(取值范围 0 到 100),n = 0 时程序结束,再输入一个值 a, 输出 n 个数中与 a 相同的数字的个数。面对这样的问题,很容易想到的是将输入的 n 个数先存储起来,然后 将输入的 n 与上述的 n 个数进行比较,cnt++ 的方式最终输出胡个数,这里介绍的是 hash 的方法,即在输入 n 个数的同时,就将它们对应的个数进行存储...原创 2019-02-27 20:14:19 · 270 阅读 · 0 评论 -
【c/c++】机试排版类问题
第一题,打印梯形:题目描述:输入一个高度 h,输出一个高为 h,上底边为 h 的梯形。输入:一个整数 h(1<=h<=1000)。输出:h 所对应的梯形。样例输入:4样例输出: **** ****** ******************这题比较简单,代码为:#include<ios...原创 2019-02-27 22:42:00 · 386 阅读 · 0 评论 -
【二分查找】c++ 中 stl 直接调用二分搜索函数
在<algorithm>中有直接实现二分搜索的函数,这样解决一些简单问题时,就不必再手撕算法了。1. binary_search(arr[],arr[]+size , index)二分查找,其中,arr[] 表示数组首地址,size表示元素个数,index则表示查找的元素,首要的一点是数组必须是有序的,并且一定是从小到大的,非递减的。可以看出 size 和sort 等函数的...原创 2019-02-24 22:07:29 · 810 阅读 · 0 评论 -
【c/c++】查找问题
查找可以按照简单的直接进行遍历,当然最好的方法是先排序,然后按照二分搜索的方法进行查找。先来看题目:题目描述:输入 N 个学生的信息,然后进行查询。输入:输入的第一行为 N,即学生的个数(N<=1000)接下来的 N 行包括 N 个学生的信息,信息格式如下:01 李江 男 2102 刘唐 男 2303 张军 男 1904 王娜 女 19然后输入一...原创 2019-03-01 15:40:04 · 440 阅读 · 0 评论 -
【c/c++】机试贪心算法问题(javaBeans问题和今年暑假不AC问题)
贪心算法就是在解决问题时,总是做出当前看来最好的选择,不从整体最优上进行考虑,做出的是局部意义上的最优解。这样看来好像贪心算法有很大的风险,只考虑当前的情况是否能得到总体上的最优解,实际上,贪心算法要求当前做出的每一步都是独立的,不能对以后的状态产生影响,只与当前状态有关。先看一个题目:FatMouse prepared M pounds of cat food, ready to tr...原创 2019-03-01 16:55:05 · 240 阅读 · 0 评论 -
[c++] vector 的几种初始化的形式
下面是vector的几种初始化的形式,需要注意的是,在vector中都是用 v.begin(),v.end(),v.begin()+ 1 之类的来表示地址,没有直接用 v 的,这点说明iterator和指针的共同之处。代码为:#include <algorithm>#include <iostream>#include<functional>#i...原创 2019-02-25 21:10:07 · 5470 阅读 · 0 评论 -
【c++】冒泡排序用数组和vector两种形式的写法
冒泡排序确实是一个经典又简单的算法,但是实际上如果不是重新拿起来进行一下好好地复习,我担心让我写的话我还是写不出来的,所以只有不断的动手写才能不断提高自己的水平。所谓冒泡就是不断的在待排序数中前后两两比较,不断把大数向后面排,每次只排前面的未完成排序的数,时间复杂度为O(n^2),所以冒泡排序的效率很低,在oj 时间要求很重要的情况之下,一般都不会使用冒泡排序。方法1(vector):用v...原创 2019-02-25 22:04:21 · 2637 阅读 · 0 评论 -
【c++】栈stack stl 的相关问题
stack 栈是一种LIFO(后进先出last in first out)的数据结构, 它在stl 函数中是通过其它容器,如队列实现的,stack不能使用iterator迭代器,在首部的声明是#include<stack>, 一般c++自己的头文件都不带.h。stack的常用个函数包括了,push(),pop(),top(),empty(),swap() (为空时返回true),s...原创 2019-03-01 20:10:34 · 356 阅读 · 0 评论 -
【c/c++】机试中的二叉树遍历问题
首先解决一个问题,int a[10]; change(a); 而子函数则写为void change(int a[]) 此时相当于传入的是指针,此时可以在子函数中实现对数组a[]的修改!先序遍历,就是先遍历根结点,再遍历左子树,然后是右子树;中序遍历,就是先遍历左子树,再遍历根结点,再遍历右子树;后序遍历,就是先遍历左子树,再遍历右子树,最后遍历根结点。可以根据先序遍历序列和中序遍历序列,建...原创 2019-03-05 19:57:57 · 480 阅读 · 0 评论 -
【c++】 scanf,printf,gets(),getchar()以及eof
首先解决一下gets()与scanf的区别:scanf()不会读入空格或者换行符,结束输入时,缓冲区还有换行符,而gets()则会读入空格或换行符,并将换行符转换为0,缓冲区不会剩下换行符,所以先scanf又换行后,用到gets()时,直接用,只会读一个换行符并转换为0,加上一个getchar()接收换行符,才能读到真正的字符串,而scanf()换行后又用到scanf则不用getchar(),...原创 2019-02-26 17:35:45 · 680 阅读 · 0 评论 -
【c++】 sort函数的使用(printf格式)
首先注意下如果运行程序时提示 exe 文件无法写入,那么可能是修改程序前的黑框命令栏还存在,只需要关闭命令行即可。这里主要是实验下printf 即 c 语言格式的输出:#include<iostream>#include<cstdio>#include<stdlib.h>#include<algorithm>#include<...原创 2019-02-26 19:30:26 · 480 阅读 · 0 评论 -
【c/c++】 sort 对自定义结构体排序
自定义结构体进行对结构体内部的各个项进行排序题目描述:有 N 个学生的数据,将学生数据按成绩高低排序(从低到高,这一点可以从所给的实例中体现出来),如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N个学生排序后的信息。输入:测试数据有多组,每组输入第一行有一个整数 N(N<=1000),接下来的 N行包括 N 个学生的数据。每个学生...原创 2019-02-26 20:16:15 · 5379 阅读 · 0 评论 -
【c++】sort 与 qsort 的简单使用
先给出程序:#include <algorithm>#include <iostream>#include<functional>using namespace std;//降序排列函数bool desc(int a, int b);//qsort()对int的排序函数,在algorithm中定义int qcmp1(const void*a...原创 2019-02-22 20:15:31 · 289 阅读 · 0 评论 -
【算法】【c/c++】机试中的日期类问题
首先介绍一下c 语言中的字符串,include<string.h> 与 c++ 中的string 是不同的,c 语言中的string 实际是字符串数组,末尾有一个'\0'空字符,所以字符串数组的长度是实际长度加 1。日期类问题也是机试中经常考察的问题 :有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天(即程序中最后 + 1的操作)输入:有...原创 2019-02-26 22:39:17 · 273 阅读 · 0 评论 -
【c/c++】机试中的二叉排序树问题
二叉排序树,又叫二叉搜索树,它的主要特点是对于每个结点,它的左子树上所有结点的值都要小于该结点的值,而右子树所有结点的值都要大于该结点的值,由此我们知道,在对二叉排序树进行中序遍历时,得到的序列一定是一个递增序列。所以这类问题的重点就是如何构造二叉树。注意create()函数只有在新建一个结点时才需要,类似于new或malloc出一个,分配适当的空间,要注意的是Node* cur, 如果是 c...原创 2019-03-06 14:52:34 · 436 阅读 · 0 评论 -
【c/c++】queue, priority_queue, 堆以及哈夫曼树
1. 首先对 queue 队列进行介绍,队列是一种先进先出(FIFO)的数据结构,与栈很相似,不同之处就是它每次从队首出队,而不是从队尾出队,在c++中引用 #include<queue>使用相关函数,定义方法: queue<int> q; 用queue<int> q2(q) 实现拷贝操作。主要的函数有push(i), pop(), front(), back...原创 2019-03-04 21:05:20 · 366 阅读 · 0 评论 -
石头移动问题(POJ河中跳房子)
poj上问题链接河中跳房子给出 L, N,M,L表示两岸最左边和最右边的石头的距离,最左边和最右边的石头不能移动,中间有N块石头都可以移走,要求移出M块石头,要求给出移出M块石头所能得到的移出后相邻两块石头间最短距离的最大值(因为移出不同的M块石头,所有相邻两块石头间的最小值可以不相同)。其次给出N行,分别表示距离最左边石头的距离:最左边和最右边的石头距离最左边的石头的距离分别为a[0...原创 2019-08-23 15:12:02 · 924 阅读 · 0 评论