算法
文章平均质量分 71
UFO___
也不要小看悟能
展开
-
网易2019实习生招聘编程题集合—牛牛的背包问题(分治+二分查找)
[编程题] 牛牛的背包问题时间限制:1秒空间限制:32768K牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。输入描述:输入包括两行第一行为两个正整数n和w(原创 2018-05-08 12:10:13 · 1212 阅读 · 0 评论 -
网易2018校招内推编程题_疯狂队列
[编程题] 疯狂队列时间限制:1秒空间限制:32768K小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值原创 2017-08-15 10:52:28 · 447 阅读 · 0 评论 -
网易2018校招内推编程题_堆棋子
[编程题] 堆棋子时间限制:1秒空间限制:32768K小易将n个棋子摆放在一张无限大的棋盘上。第i个棋子放在第x[i]行y[i]列。同一个格子允许放置多个棋子。每一次操作小易可以把一个棋子拿起并将其移动到原格子的上、下、左、右的任意一个格子中。小易想知道要让棋盘上出现有一个格子中至少有i(1 ≤ i ≤ n)个棋子所需要的最少操作次数.输入描述:输入原创 2017-08-15 10:46:32 · 2426 阅读 · 0 评论 -
HDU4545(最长公共子序列)
题目很明显了,最长公共子序列。但是构建映射的时候我用了multimap结果超时。。。。。直接用hash就好,因为范围不大,就26个字母。还有一点要吐槽的是我把两个串的索引写反了 竟然提醒我RE而不是WA 结果一道水题优化了一下午。我真是去年买了个表 fuck mmp 草TMD #include #include #include原创 2017-07-21 18:49:08 · 433 阅读 · 0 评论 -
网易2017春招笔试编程题 分饼干
编程题] 分饼干时间限制:1秒空间限制:32768K易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值 输入描述:输入包括两行:第一行为盒子上的数值k,模糊的数位用X表示,长度小于1原创 2017-08-21 16:04:08 · 767 阅读 · 0 评论 -
基础数据结构算法_哈夫曼树
哈夫曼树还是比较实用的,又简单。具体的实现方法:设一个优先级队列,频率越小的字母越优先。每次都从队列中取出最前面两个元素,合并成一个新的元素。知道元素一个。具体的实现细节看代码把。 #include #include #include #include using namespace std; typedef struct原创 2017-07-19 13:58:25 · 390 阅读 · 0 评论 -
基础数据结构算法_二叉树的恢复和非递归遍历
我把二叉树的恢复和遍历写在一起了,刚好恢复完之后就能遍历,上数据结构实验课的小伙伴有福了。二叉树的恢复一定要中序序列,然后先序序列或后序序列的随便一个,其实原理都一样。对于先序来说,第一个元素是树的根节点,重点来了,用这个节点去分割中序序列。(设该节点在中序序列中的位置为i)那么对中序序列来说i左边的为左子树,i右边得为右子树。然后找出先序序列中的左右子树,递归的进行这步操作即可,原创 2017-07-18 17:55:20 · 382 阅读 · 0 评论 -
基础数据结构算法_计数排序,基数排序,桶排序
这三个是线性时间的排序算法,对排序的数据有一定要求。计数排序:适合排序指定区间内的整数型,并且跨度不能太大。简单来说就是开辟一个count[]数组,count[i]表示整数型i出现的次数。然后从头到尾收集起来即可。#include #include #include #include using namespace s原创 2017-07-16 21:18:46 · 409 阅读 · 0 评论 -
基础数据结构算法_快速排序,堆排序,归并排序
还是把基础数据结构复习一下吧,算法虽然简单,但是想把后面的思想完全领悟还是比较困难的。这个是排序的三件套,快速排序,堆排序,归并排序。快速排序:以第一个数为支点,把比他小的放前面,比他大的放后面。完成这一步需要在一个大循环里嵌套两个并列的小循环。大循环控制是否结束,第一个小循环控制把小数往前移,第二个控制把大数往前移。然后以支点的位置分别左右递归。 #incl原创 2017-07-16 20:47:09 · 401 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 2 Regular polygon
一开始的时候我是枚举正方形的中心,结果wa了一下午,水平太菜了。正确的方法是每次枚举两个点,然后就能计算出另外4个点的坐标(对于常年没数学的还是在纸上一笔一划的把点坐标求出来)然后这样结果会是4倍,结果/4即可。还有一点,我虽然知道多关键字排序,但是稍微变一下我就不会了。。。。用pair代表坐标,然后按这两个关键字进行排序,这样找点的时候就能二分查找了。所以这道题目对于水平不行原创 2017-07-28 10:54:07 · 348 阅读 · 0 评论 -
CodeM 黑白树
题目描述:一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1。树上每个节点i对应一个值k[i]。每个点都有一个颜色,初始的时候所有点都是白色的。你需要通过一系列操作使得最终每个点变成黑色。每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑。问最少使用几次操作能把整棵树变黑。 输入原创 2017-08-05 09:50:09 · 607 阅读 · 0 评论 -
网易2018校招内推编程题_小易喜欢的数列
[编程题] 小易喜欢的数列时间限制:1秒空间限制:32768K小易非常喜欢拥有以下性质的数列:1、数列的长度为n2、数列中的每个数都在1到k之间(包括1和k)3、对于位置相邻的两个数A和B(A在B前),都满足(A 例如,当n = 4, k = 7那么{1,7,7,2},它的长度是4,所有数字也在1到7范围内,并且满足第三条性质,所以小易是喜欢原创 2017-08-15 11:04:10 · 1214 阅读 · 0 评论 -
hdu6181 Two Paths
一道A*算法求第k短路的模板题,但是!我有话要说。可能因为学校老师比较水,我们讲迪杰斯特拉算法的时候老师讲了个n^2算法实现的,教科书上也他妈n^2,我也没细想后来比赛的时候我自己优化了,结果一百度发现直接优先级队列,elogn。。。。。伤心,错过一道水题。自己做了个模板,以后直接用。对了,A*算法确实有复杂的用法,但是我们这里只要利用他求第k短就行了。至于估值函数 F=G+H 这原创 2017-08-25 19:32:22 · 398 阅读 · 0 评论 -
HDU4547(tarjan算法 离线LCA)
我也是第一次接触tarjan算法,来来回回花了不少时间才把这道水题做出来了。tarjan算法是一种离线算法(就是等询问全部输入完了再一并处理),算法本身其实挺容易理解。就是需要用到的数据结构有点繁杂,第一次接触肯定不太习惯,多练几次就好了。下面是ac代码。 #include #include #include #include #inc原创 2017-07-24 17:22:30 · 501 阅读 · 0 评论 -
网易2019实习生招聘编程题集合—矩形重叠(线段树)
[编程题] 矩形重叠时间限制:1秒空间限制:32768K平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。输入描述:输入包括五行原创 2018-05-08 11:57:19 · 712 阅读 · 0 评论 -
算法总结—最大流
题目链接点击打开链接直接套模板就好了,如果求二分图的最大匹配的话可以设置一个超级原点和超级汇点把容量设为1的有向图,跑一次最大流即可。#include<iostream>#include<cstdio>#include<vector>#include<algorithm>using namespace std;//如果是无向图,建图时,把反...原创 2018-05-07 12:02:41 · 294 阅读 · 0 评论 -
算法总结—字符串匹配
字符串匹配的算法很多,我也只会两种特别典型的,KMP和AC自动机,KMP是单模式匹配是AC自动机的退化版,在单匹配的时候比AC自动机更快一点,实现更简单。AC自动机是多模式匹配,又快又牛逼。KMP模板如下:#include<iostream>#include<string>using namespace std;string pat,text;int Next[10...原创 2018-05-02 13:11:25 · 254 阅读 · 0 评论 -
算法总结—线段树
HDU1556点击打开链接比较简单的一道题,直接查询的时候从上到下把value累加就行。//hdu 1556 线段树 单点查询 #include#include#include#includeusing namespace std;int N;typedef struct node { int value; int left,right;}node;node tree原创 2018-04-22 12:02:01 · 314 阅读 · 0 评论 -
基础数据结构算法_DFS and BFS
图的常用遍历方法无非就是BFS和DFS,这也是常用的搜索方法。BFS全称为广度优先搜索,以广度优先,一般采用队列辅助实现。DFS全称为深度优先搜索,以深度优先,一般采用递归实现。这两个用途很广,比如对于优先搜索的题目,常以BFS+优先级队列的形式。还有二分图分的匹配采用BFS比DFS效率高,以及多状态搜索也采用BFS。下面给出一道多状态搜索的题目:假设一个探原创 2017-08-10 09:29:34 · 683 阅读 · 0 评论 -
算法总结—最短路径算法
针对 优先级队列优化过的dijkstra算法 以及 SPFA算法 进行讨论一号选手:优先级队列优化过的dijkstra算法 先贴出该算法的实现模板:void dijkstra(int start) { for(int i=1;i<=T;i++) { dis[i]=inf; } dis[start]=0; priority_queue<node> pq; node...原创 2018-02-25 15:03:25 · 418 阅读 · 0 评论 -
算法总结—最小生成树算法
克鲁斯卡尔算法(本质:边的排序+并查集判断是否成环)代码模板:typedef struct node { int u,v;//克鲁斯卡尔需要边 但是不需要图 int len;}node;vector edges;int n,m;int bs[105];//并查集 //findint ask(int ch) { if(bs[ch]==ch) { return ch原创 2018-03-04 19:02:37 · 357 阅读 · 0 评论 -
斐波那契第k项
按自己风格写的,以后就直接用了。#include#includeusing namespace std;typedef long long ll;const ll mod=1e9+7;// [fn] = [1,1] * [fn-1]// [fn-1] [1,0] [fn-2]// 以0作为第一项 ll m[3][3],g[3][3原创 2017-09-12 13:54:15 · 447 阅读 · 0 评论 -
HDU6165(tarjan算法 强连通缩点,拓扑排序)
这里说明一下,tarjan是一个人,他发明的算法都以他命名,所以,tarjan后面要加后缀,不然不知道是哪个算法。一道比较标准的模板题,这里有篇很好的讲强 tarjan求连通分量 的博客点击打开链接我这里直接把新图构建出来了,然后拓扑排序即可,只要那一层出现两个入度为0的点即不能到达。#include#include#include#include#include#inclu原创 2017-08-30 10:36:53 · 684 阅读 · 0 评论 -
HDU6201(树上dp)
给定的图有 n 个节点,n-1 条边,这个图是一棵树。任意一个节点都可以作为根节点,先处理叶子节点在处理上一层,这样处理下来就是一次后序dfs过程了。对于每个节点来说,有一个最优买入价格(分为两种情况,1:从该节点的所有子树中挑一个最优买入价格+该路径代价,2:从自己这里买),举个例子,设父节点为 u ,子树的根节点为 v,那么 u 的最优买入价格= 所有的 v 的最优买入价格 +原创 2017-09-12 12:02:54 · 869 阅读 · 4 评论 -
2017 Multi-University Training Contest - Team 2 Maximum Sequence
这个题目简单的贪心即可(后面附上官方证明),实现起来要注意ai数组要不断更新,b数组排序后从头往后依次使用即可。官方证明:预处理:a_i -= i ,易证明从最小的b开始选每次选最大的一定可以使结果最大。 证明思路:如果条件改为a_i<=max{a_j-j|b_k<=j<=n},那么b的顺序与最后的结果无关。条件改回来后,由于每次要计算一个数的最大值时都有a_(n+1)...a_(i-1)在范原创 2017-07-27 18:10:07 · 462 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 2 To My Boyfriend
我是参考了这篇文章点击打开链接接下来我讲几个比较关键的点。1.n*m的大矩阵总的有(n+1)*n*(m+1)*m/4;2.颜色是从0开始依次累加的。3.这个符合要求的子矩阵存储用int 会爆掉,(这个我估算错了一次。。。)进过这两次比赛(我是小白),感觉杭电喜欢考容斥还有贡献和问题(我认为是一类 A占有B 但是却反过来计算从B被多少A占有,就像这道题)。这样的题目其实不是很原创 2017-07-31 11:55:30 · 363 阅读 · 1 评论 -
2017 Multi-University Training Contest - Team 2 TrickGCD
诡计多端的GCD。。。其实这个题目不是很难,题目的元素范围已经提示了我们枚举GCD。先用sum进行一个计数过程,然后前后累加sum。这样是为了快速找出我们想要范围内的元素,例如sum[i]-sum[j]=范围到j-1的元素个数,时间复杂度O(1),很棒棒。这里是为了一次消灭一个范围的元素。这样我们就得到了一个如何在数组中快速查找范围元素个数的方法(小范围整数数组)。接下来就原创 2017-07-30 08:46:10 · 244 阅读 · 0 评论 -
HDU5716(shiftand算法)
昨天看到shiftand算法,今天在队友的帮助下做了这道题。对于一般的shiftand算法会有一个 文本串 string s 匹配串 string t 一个字符映射B 把t里面的字符作为key把字符在该串中的位置的01序列作为value然后用一个01序列 D 来回更新 直到找到对应的字符串(不懂shiftand算法的先去学习一下)这个题目有点奇怪,它的匹配字符串 str原创 2017-06-10 19:16:49 · 427 阅读 · 0 评论 -
HDU5696(分治)
我是看了这位大神写的http://m.blog.csdn.net/article/details?id=51477402但是他没有做详细的解释,我来以我的理解解释一下。首先对于区间(1,n)我们找到最小值min和最大值max,则ans[n]=min*max。记录下min的位置minw,开始递归(1,minw-1)和(minw+1,n)我称之为左右区间,区间大小为L和R,接下来是重点原创 2017-06-13 12:07:11 · 317 阅读 · 0 评论 -
变位词快速分离
变位词是形如以下的单词 eat tea 和 silent listen 互为变位词,那么对于一个单词的集合怎样快速的把变位词分离出来呢首先把 单词的每个字符进行排序,这样所有的变位词就有了相同的序列,然后在对这些进行序列进行一次排序。这样就把这些变位词分离出来了。时间复杂度 nlogn #include #include原创 2017-06-13 12:28:15 · 347 阅读 · 0 评论 -
HDU5969(二进制计算)
这个题目比较简单,把所有数转换成二进制找找规律就行,比如说 1和110可以位或成111,10和101也可以位或成111,我们把r这个数的所有的二进制0转化为1,产生出一个新数mr,然后mid=mr/2,r必定大于mid,如果L提取出出来,在进行一次上述操作,细节的问题看代码 #include #include #include原创 2017-06-25 11:49:47 · 407 阅读 · 0 评论 -
HDU5249(set+queue模拟)
这种动态查询中位数的题目比较老了。。。我在这篇博客的最后面也讲到了 点击我原理是一样的,只不过把堆改成了set,因为要删除元素再加一个queue记录进入顺序。我这里用比较简练的方式实现了。 #include #include #include #include #include using n原创 2017-06-24 11:26:52 · 393 阅读 · 0 评论 -
HDU1698(线段树+延迟标记)
一看便知道用线段树,题目比较水,一般简单的线段树就是两招 离散化和延迟标记这道题目明显是用延迟标记,不要用链式树,用树状数组,否则会超空间。#include #include #include using namespace std; int N,Q; typedef str原创 2017-07-11 17:35:52 · 389 阅读 · 0 评论 -
HDU5248(二分+模拟)
一般这种求什么最大中的最小或者最小中的最大,差不多都要用到二分法。既然已经知道用什么就简单了,注意A序列没有负数但是B序列可以有负数。我们函数 judgefail(int curr) 来判断当最大代价为curr时该序列是否可以变成严格单调。judgefail函数直接模拟就好,只要使后面一个元素尽量的接近前面一个元素即可。对于第一个元素,当然是越小越好。设x=0,s=100000原创 2017-06-19 13:23:23 · 563 阅读 · 0 评论 -
HDU5247(技巧暴力)
这道题的测试组只有一组,可想而知这一组数据量会比较大,既然选择暴力干脆建立一个res[]数组表示答案,res[i]表示k=i时的答案,有几点需要注意,直接暴力是不行的,要带点技巧,1,因为要求连续序列所以没有重复元素set即可以实现,2,当一个set里面没有重复元素时且max-min+1==序列长度时,res[max-min+1]++;详细的见代码: #inclu原创 2017-06-18 23:20:24 · 456 阅读 · 0 评论 -
HDU5246(模拟)
这个题目还是比较简单,每次选择自己能吃的分数最大的一个人,然后涨经验,最后和boss比一下谁的分数高。郁闷的是用递归死活没过,改成循环才过了,无语。。。。。。 #include #include #include using namespace std; long long n,m,k; long long arr[10005];原创 2017-06-18 09:45:56 · 309 阅读 · 0 评论 -
CodeM 数码
给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。 输入描述: 一行,两个整数 l 和 r (1 ≤ l ≤ r ≤ 10^9)。输出描述: 输出9行。第 i 行,输出数码 i 出现的次数。输入例子1: 1 4输出例子1: 4 2 1 1原创 2017-08-08 10:45:13 · 753 阅读 · 1 评论 -
HDU5698(排列组合 C(a,b)modP 模板 )
参考了较多的文章,就不一一附上链接了。起点和终点之间确定一个矩形,(不包括起点和终点),设宽为N,高为M。这最大可走步数 step=min(N,M) ,对于走一步完成的只有一种情况,即t(1)=1对于走两步完成的有 t(2)=C(N,1)*C(M,1)对于走三步完成的有 t(3)=C(N,2)*C(M,2)...........接下来套用C(a,b)modP 模板原创 2017-06-13 21:01:29 · 614 阅读 · 0 评论 -
大数乘法模板
虽然基本用不上,还是写一下把。 #include<iostream> #include<cstdio> #include<vector> #include<string> using namespace std; string a,b,c; vector<int> aa,bb,cc;原创 2017-08-09 09:39:32 · 435 阅读 · 0 评论 -
2017 Multi-University Training Contest - Team 4 Counting Divisors
这个题目不算太难,就是几个关键步骤。1.进行筛选素数,这里当然不能到10^12 要开方,最后对每个数而言,大于他根号倍的素数最对就一个,也可能没有。2.我们已经把要用素数求出来了,如果直接对L-R的每个数进行分解的话,对于一些因子比较少的数来说会进行大量无用操作。这里我们用倍数进行筛选,用prime【】表示素数数组,用ar【】表示LR的每个元素,枚举prime数组,把ar【】里面是他倍原创 2017-08-04 19:22:06 · 242 阅读 · 0 评论