
算法练习
leobean18
这个作者很懒,什么都没留下…
展开
-
leetcode刷题顺序
https://zhuanlan.zhihu.com/p/104983442作者:穷码农链接:https://www.zhihu.com/question/36738189/answer/908664455来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。原文章在这里:https://hackernoon.com/14-patterns-to-ac...原创 2020-02-27 20:58:19 · 1945 阅读 · 0 评论 -
最短路径题集1
首先来个板子,单源最短路径,Dijkstra算法。杭电2544题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2544 Dijkstra需要的数据结构有4个数组,在代码中说明了每个数据结构的用途。 首先把第起点放入S集合中,然后找出不在S集合中的离起点最近的点,将其加入到S集合中。再对dis数组进行更新,看是否经过该点能够使路径长度变短。直到将所有原创 2017-06-24 17:42:10 · 1217 阅读 · 0 评论 -
大数运算
很多大数做加减乘除运算的时候,不能用int这样的变量来存储,因为位数会非常大,所以需要用数组来存储,用char数组存储后,还需要将每个字符都用 -‘0’ 来转成int型,然后就像手算那样逐位相加。 但是用java的大数运算的包,写起程序来会方便很多。杭电1002原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1002 大意: 两个大数进行相加,输出原创 2017-07-19 16:15:13 · 494 阅读 · 0 评论 -
POJ2184 Cow Exhibition
http://poj.org/problem?id=2184#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>#include<time.h>#include<set>#include<stack>#include<vector>#include<map>#in原创 2017-07-22 16:00:28 · 412 阅读 · 0 评论 -
动态规划:0-1背包问题
0-1背包问题是比较经典的动态规划,题意如下: 给定n件物品的重量和对应价值,给定一个背包的最大承重,求该背包所能装下的物品的最大价值,并输出哪几件装进了背包。 最关键的一个公式是 d[i][j] = max(d[i - 1][j], d[i - 1][j - w[i]] + v[i]); 其中,d[i][j]是指在前i件物品中,选择若干件放在承重为j的背包中,可原创 2017-05-10 21:01:14 · 735 阅读 · 0 评论 -
Codeforces Round #412 (Div. 2)
链接: http://codeforces.com/contest/807A题意:太水了,按着题目要求写就行,分好情况。#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <cstdio>#include "stdio.h"#include <stdio.h>using na原创 2017-07-27 21:23:14 · 416 阅读 · 0 评论 -
杭电1195 搜索
杭电1195原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1195 题意: 有一个密码锁,给定了当前状态和正确的状态。求到达目的状态所需的最小步数。每一步只能这样做:对某位数加1,对某位数减1,交换相邻两数的位置。思路:之前做的都是在矩阵上进行BFS,这次突然转成这样了都不会做了。但其实思路还都是一样的。原来的矩阵,搜索时要往四个方向找,现在需要往原创 2017-07-21 15:46:09 · 511 阅读 · 0 评论 -
树的直径
树的直径是指树上距离最大的两个节点的距离。 思路是两遍BFS,第一遍BFS时,任选一个起点即可,找到最后遍历到的节点,它肯定是直径的一个端点(也就是离根节点最远的点),然后再用一遍BFS遍历回去,最后遍历到的是直径的另外一个端点。同时记录下走的步数,就可以计算出树的直径了。 看下面几个相关的题:TOJ 1056原题链接: http://acm.tju.edu.cn/toj/showp.php?p原创 2017-07-06 22:24:41 · 509 阅读 · 0 评论 -
C++STL中的容器
总结一下STL中的容器,包括map, vector, deque, queue, stack, set, priority_queue。最近发现他们真的是很好用很好用啊。deque: 双向队列,可以在头和尾添加删除元素的队列。deque<int> d;//当然,也可以加入结构体//数据访问d.front(); //返回第一个元素d.back();//返回最后一个元素d.begin(); //原创 2017-07-06 22:53:58 · 355 阅读 · 0 评论 -
POJ2253 最短路径变形
原题链接:http://poj.org/problem?id=2253题目大意:意思好难懂啊,没看明白题目什么意思。看了其他人的博客,明白大概意思了。 有两个青蛙蹲在池塘中的两块石头上,其中一个青蛙想蹦到另外那个青蛙那里。中间有很多其他的石头,题目给出了每块石头的坐标。青蛙希望每一跳都能尽可能的短,所以需要求出所有路径中,找出最长的那一跳,然后把这n个最长的跳求最短,输出就是这个最长跳中最短的那个原创 2017-07-24 10:33:35 · 545 阅读 · 0 评论 -
Codeforces Round #411 (Div. 2)
链接:http://codeforces.com/contest/805A大意是:给出两个整数 i, j。输出的数满足这样的条件,它能被尽可能多的从 i 到 j 区间的数整除。 思路:只要 i, j 不相等,那么2肯定是能被区间的数整除最多的。#include <iostream>#include <algorithm>#include <cstring>#include <cmath>u原创 2017-07-27 09:13:19 · 332 阅读 · 0 评论 -
Codeforces Round #413 (Div. 2)
链接:A大意:给定需要烤的蛋糕总数、每个烤箱一次可同时烤的面包个数、每个烤箱烤一次所需要的时间、第二个烤箱加入的时间。问如果在该时间加入烤箱,能否更快的将所有蛋糕拷完。思路:顺着题意想就行,如果蛋糕总数小于烤箱容量,直接输出“No”。如果在烤最后一组蛋糕前,第二个烤箱还没有加入,也输出”No”。其余情况都是”Yes”。代码如下:#include <iostream>#include <algori原创 2017-07-30 20:56:54 · 411 阅读 · 0 评论 -
九度1491 求1和2的个数
链接: http://ac.jobdu.com/problem.php?pid=1491题目描述:给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1<=N<=10^100(10的100次方)若F(N)很大,则求F(N)mod20123的值。思路: 这题的数据量原创 2017-09-03 16:19:42 · 922 阅读 · 0 评论 -
二十四点
今天想起来了二十四点游戏,有个穷举法写的挺好的,也比较容易理解,记录一下。http://blog.youkuaiyun.com/smartboysboys/article/details/20765427原创 2017-09-11 21:56:09 · 786 阅读 · 0 评论 -
九度 1482 玛雅人的密码
1482 玛雅人的密码http://ac.jobdu.com/problem.php?pid=1482 http://ac.jobdu.com/oldexamset.php玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2<= N <=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如021原创 2017-09-02 23:36:31 · 435 阅读 · 0 评论 -
九度OJ 1086
链接: http://ac.jobdu.com/problem.php?pid=1086 http://ac.jobdu.com/oldexamset.php 清华2011机试题1086题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下: 距离s 票价 0 < S<=L1原创 2017-09-01 23:45:44 · 566 阅读 · 0 评论 -
九度1149 字串计算
链接: http://ac.jobdu.com/problem.php?pid=1149题目描述:给出一个01字符串(长度不超过100),求其每一个子串出现的次数。输入:输入包含多行,每行一个字符串。输出:对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。思路:只有100个数,可以遍历一遍(O(N^2))找到所有的字串,然后把它们都放到map里,map存原创 2017-09-10 21:47:34 · 436 阅读 · 0 评论 -
动态规划3
这两个题写完另外两个题型再回来看,先标记一下杭电2845 最大非连续子序列 http://acm.hdu.edu.cn/showproblem.php?pid=2845杭电2830 最大完全子矩阵 http://acm.hdu.edu.cn/showproblem.php?pid=2830原创 2017-06-23 22:08:36 · 352 阅读 · 0 评论 -
杭电1879 继续畅通工程
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路: 这是最小生成树的基础题,正好再用一下并查集。这里有一个不一样的地方是,有可能路已经修好了,这时候需要做一下转化,就是修好之后,那这两个点之间的花费就设置成0。 这道题卡了scanf,1000ms用cin超时,用scanf只需要500ms,所以,以后全用scanf和printf。 并原创 2017-07-23 11:44:25 · 404 阅读 · 0 评论 -
九度1084 整数 拆分
链接: http://ac.jobdu.com/problem.php?pid=1084题目描述:一个整数总可以拆分为2的幂的和,例如:7=1+2+47=1+2+2+27=1+1+1+47=1+1+1+2+27=1+1+1+1+1+27=1+1+1+1+1+1+1总共有六种不同的拆分方式。再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=原创 2017-09-03 21:08:29 · 462 阅读 · 0 评论 -
北大大数据机试题
http://bailian.openjudge.cn/dsj2017xly/下面是G题,正好试一下优先队列G:双队列总时间限制: 1000ms 内存限制: 65536kB描述系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求0 系统停止运行1 K P 优先度为P的客户K进入系统2 找到优先度最高的客户,原创 2017-07-06 13:01:29 · 1406 阅读 · 0 评论 -
一堆数中选第k大的数
在很多数里,选择第k大的数。 1.先排序,再直接选择。复杂度太高,最少o(nlogn) 2.用O(n)复杂度选择: 比如:利用快速排序的partition函数,先选出一个基准元素,然后将比它大的都移到右边,小的都移到左边,如果基准元素的位置i比k大,那么第k大的元素就在左边第i-k大的数。否则就在右边第k-i大的数。使用中位数方法,将这n个数每五个作为一组进行排序,找出每组的中位数,并依次原创 2017-06-15 11:31:05 · 864 阅读 · 0 评论 -
快速幂和矩阵快速幂
这篇博客讲的比较详细,关于快速幂和矩阵快速幂的。 http://blog.youkuaiyun.com/hikean/article/details/9749391快速幂快速幂就是计算a^n时,能使复杂度从O(n)降到O(logn)。 它的原理是这样的: 将n写成2进制形式,比如,求a^9。9的二进制写法为 1001,即 从最后一位开始看,是1,所以计算a^1,并加入到结果中,然后看倒数第二位,为0原创 2017-06-14 14:23:14 · 275 阅读 · 0 评论 -
动态规划题集(转载)
本内容为转载,原作者不知,如侵权即删。1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].转载 2017-05-20 22:30:11 · 419 阅读 · 0 评论 -
找零钱问题
找零钱问题: —–动态规划基础问题 现有一堆面值为 1,2,5,20的硬币,问最少需要多少个硬币才能找出总值为 N的零钱。 如果每个面值的硬币数无限,而且只需要输出最小个数,可以直接建立一个d[i]的数组,表示换i元时所需要的最少数量: d[i]=min{ d[i-v(j)] + 1 } 即用两层循环,第一层是建立d[i]数组,第二层是遍历硬币的面值,然后+1,取原创 2017-05-15 22:55:11 · 644 阅读 · 0 评论 -
哈夫曼树 九度1172
题目描述:哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。输入:输入有多组数据。每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。输出:输出权值。样例输入:5 1 2 2 5 9样例输出:37这个题可以建树也可以不建树。原创 2017-04-22 21:34:15 · 718 阅读 · 0 评论 -
之前题目简单总结
上学期在杭电ACM上刷了一部分简单题,当时没有博客记录,用记事本简单记了下,现在把它们放在博客上记录一下,方便以后整理:HDU 2045 关于方格染色的 类似于动态规划 解析: HDU2045 方格染色2046 这样的N=50,表示超出了int的范围,所以要用_int64 %d改成%I64d2050 折线分割平面 分割平面的个数=交点个数+顶点个数+1 令f(n-1)为前n-1条折线原创 2017-05-04 11:28:08 · 366 阅读 · 0 评论 -
DFS基础 POJ1321 棋盘问题
DFS用的情况非常多,像八皇后问题等等,它需要一个visit数组,来描述节点是否被访问过,然后就是递归调用DFS了。 下面是POJ1321棋盘问题,题目描述及代码如下:#include<iostream>using namespace std;//POJ 1321 棋盘问题 int ans; //最终总数int visit[9] = { 0 }; //visit[i]只表示第i列是否已经放原创 2017-05-02 21:31:13 · 362 阅读 · 0 评论 -
并查集 hdu1232畅通工程
前段时间做阿里的笔试题,考到了并查集,于是学了一下并查集的知识,顺便附上杭电1232的最最基础的并查集例题作为参考。 并查集就是一种简单的算法,包含一个数组,一个find函数,一个merge函数,仅此而已。当然,merge函数在什么情况下使用,就要根据题目具体要求来处理了,这才是值得着重考虑的地方。 其中,数组存储每个元素的父亲元素所在的位置。find函数是找到某个元素的“祖宗”,也就是它所在门原创 2017-04-30 22:46:38 · 442 阅读 · 0 评论 -
二叉树的最长路径
在一个二叉树中,输出从根节点到叶子节点的最长路径。 首先,找到最长的长度是比较容易的,直接求数的高度就可以,但是如果输出该条路径,需要两个节点数组来记录路径。 求树的高度的代码如下:int BinaryTree :: Depth (BinTreeNode *t ) { if ( t == NULL ) return -1; else return 1 + Max ( Depth原创 2017-04-19 23:04:02 · 4097 阅读 · 4 评论 -
最长公共子序列和字串 动态规划
最长公共子序列问题: 给两串字符串或者数字,如 ABCAC ACBAA 最长公共字串就是AC,最长公共子序列是ABA 两者区别是字串必须挨着,但是子序列只需要顺序一致即可。最长公共子序列动态规划思想,定义一个数组d[m][n]。其中m,n分别代表两个串的长度。然后如果str1[i]==str2[j], 则d[i][j] = d[i-1][j-1]+1 如果str1[i]!=str2[j]原创 2017-06-26 23:34:36 · 416 阅读 · 0 评论 -
树状数组
在学习逆序数计算的时候,原创 2017-06-28 10:13:50 · 340 阅读 · 0 评论 -
动态规划题集1
杭电2955题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2955 题目大意是:一个抢银行的人,想在尽可能低的被抓概率内偷到更多的钱。 输入: 第一行:p和num,分别表示可忍受的被抓概率和银行的个数。 接下来num行,每行有w和v,分别表示该银行的钱数和被抓概率 输出: 在被抓概率小于p的情况下,最大的抢的金额数。思路:动态规划,类似于原创 2017-05-19 22:49:25 · 577 阅读 · 0 评论 -
杭电2782
杭电2782原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2782 思路:代码如下(未通过样例,还需更改)#include <algorithm>#include <cstring>#include <iostream>#include "stdio.h"using namespace std;int a[625][625];int vi原创 2017-07-01 23:20:13 · 336 阅读 · 0 评论 -
逆序数的求法
给定一串数字,求这串数字的逆序数。用两个for循环,O(N^2)的复杂度,最容易考虑到的用归并排序的方式。利用树状数组,这个方法等到写数状数组的时候再写。归并排序求逆序数的方法假如归并时,将a[n]分成a(1,,,mid)和a(mid+1,,, j) 两部分,排序后得到如下的串: 1 3 4 8 9 (前半部分) 2 5 6 7 10 (后半部分) 如果4>2(str1[i]>str原创 2017-06-27 10:46:44 · 1615 阅读 · 0 评论 -
简单题 记录
一道DP简单题题目链接这个题只需要填充一个二维数组,注意边界值,其他的就没什么了。设d[i][m]表示第m分钟到达第i棵数的路径个数。那么 d[i][m] = d[N-1][m-1] (i=N) d[i+1][m-1] (i=1) d[i-1][m-1] + d[i+1][m-1] (1 < i < N)按照这个状态转移方程原创 2017-06-14 10:09:46 · 274 阅读 · 0 评论 -
最短路径题集2
POJ 2502原题链接: http://poj.org/problem?id=2502 大意:一个同学从家到学校,有几条地铁,给出家和学校的位置坐标和每条地铁线上的车站坐标,同学步行速度和地铁运行速度也给出。求同学从家到学校的最短时间。 原题中只有200个车站,所以直接用矩阵存储就可以。然后重点是如何建立图结构。车站与车站之间,必须是在一条地铁线上才想通。每有一个地铁站,就要计算家和学校步行原创 2017-06-25 22:45:22 · 543 阅读 · 0 评论 -
BFS基础题 杭电2612 Find a way 1252 Hike on a Graph
BFS与DFS简单对比DFS适合将所有的全都遍历一遍,就像之前的博客中的两道DFS基础题,比如最多可以走几步,所有的连通区域个数,这些都需要全部遍历完才能知道。而BFS,比如求最短的距离,可以直接宽度优先搜索目的地,不需要全都遍历一遍才可以求最短路径。当然,BFS也可以用于全部遍历之后才得出最终解的题目。不过,BFS不适合求解诸如最多可以走几步这样的题目。下面是杭电2612的链接: http://原创 2017-07-04 09:53:09 · 591 阅读 · 0 评论 -
杭电2571-命运 动态规划
原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2571这题浪费了太多时间了,到现在还WA,通过了好几个样例,还是没找到错误。先记录一下学到的其他东西。 错的第一个地方,是找j的因子的时候,sqrt(j)的时候,如果j%p==0,说明找到了两个因子,但是我只写了一个。具体代码在下面。 错的第二个地方,是我对数组初始化的错误。 现在才突然想到d[1原创 2017-06-22 21:50:59 · 388 阅读 · 0 评论 -
DFS简单题 杭电1241 POJ 1154
DFS和BFS两种搜索方式,DFS是利用递归方式,需要一个visited数组,记录是否将节点访问过。BFS用队列来存储部分中间节点。 数据量小,而且要求简单,就用DFS。杭电1241DFS简单题 原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1241 题目大意是:一个公司开采石油,在一个矩形区域,每个元素要么有油,要么没油,如果有油的地方是连接原创 2017-06-30 16:45:29 · 732 阅读 · 0 评论