
★ACM基础知识
文章平均质量分 71
liuyanfeier
acmer
展开
-
各种排序算法的分析与实现
由于最近在找工作的过程中遇见了很多考察各种排序算法的问题,而我对此却不是非常熟悉,所以花了一些时间做了一个非常简单的总结。一.直接插入排序(straight insertion sort)直接插入排序算法是稳定的排序算法,时间复杂度为O(n^2)。思想为:假设待排序的数组存放在a[1...n]中,初始时,a[1]自成一个有序区,无序区为a[2...n]。从i=2到i=n原创 2016-04-11 13:42:16 · 949 阅读 · 0 评论 -
poj1942求组合数
就是一求组合数的问题。#include #include using namespace std;#define ULL unsigned long long intint main(){ ULL a, b; while (cin >> a >> b && (a || b)) { if (b > a) swap(a, b);原创 2016-06-01 14:25:36 · 341 阅读 · 0 评论 -
POJ 3252 Round Numbers(数学问题)
Round Numbers 就是一个表示成二进制的时候0比1多或者相等的正数。题目是给定一个区间,问在这个区间上的Round Numbers有多少个?(1 ≤ Start Finish ≤ 2,000,000,000).这个题目一看不怎么会写,其实仔细分析可以知道是一个数学题目。n很大,但是我们可以根据n的二进制的位数来计算,最多不超过33位。具体解法参考以下b原创 2016-06-01 13:02:16 · 433 阅读 · 0 评论 -
51nod 1005 大数加法(可为负数)
给出2个大整数A,B,计算A+B的结果。Input第1行:大数A第2行:大数B(A,B的长度 Output输出A + B没什么思路,就是转化为字符串之后模拟。#include #include #include #include using namespace std;int cons原创 2016-05-20 13:12:54 · 1330 阅读 · 0 评论 -
给定两个链表表示的整数,编写函数对这两个整数求和,并用链表形式返回结果。
struct ListNode{ int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};ListNode* Reserve(ListNode* l){ if(l==NULL)return NULL; ListNode *p = NULL;原创 2016-06-03 15:09:20 · 5279 阅读 · 0 评论 -
POJ 1845 数学问题
求A^B的所有约数(即因子)之和,并对其取模 9901再输出。 (0 我们首先要用到这样一个定理,数字A的所有因数之和,对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)有A的所有因子之和为: S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (原创 2016-06-02 10:48:47 · 517 阅读 · 0 评论 -
POJ1019 数学+递推乱搞
有一个字符串的形式是这样的11212312341234512345612345671234567812345678912345678910123456789101112345678910..........现在要求你写出他的第n位上的数字是什么,是数字而不是数,1 ≤ n ≤ 2147483647。首先我们分析这个字符串可以看出它是由这些子串组成的,1,12,123,1234,12原创 2016-06-01 15:53:13 · 378 阅读 · 0 评论 -
大数加减乘除等的模板以及1000以内阶乘的模板
#include#include#include#include#include#include#includeusing namespace std;#define maxn 9999#define maxsize 1000#define dlen 4class BigNum{private: int a[1005]; //可以控制大数的位数 int le原创 2016-05-20 16:07:32 · 579 阅读 · 0 评论 -
POJ1985+POJ2631 求一棵树的直径
这两个题目都是求解一棵树的直径,也就是书里面的最长的一段距离。树的直径是指树的最长简单路。求法: 两遍BFS(dfs) :先任选一个起点BFS(dfs)找到最长路的终点,再从终点进行BFS(dfs),则第二次BFS(dfs)找到的最长路即为树的直径。证明网上有很多,在此就不写了。下面分别列出两种方法,一种是bfs,一种是dfs。//POJ 1985#原创 2016-05-11 18:14:47 · 1762 阅读 · 0 评论 -
51nod1072 求解一个图里面的强联通分量
给出一个无向图G的顶点V和边E。进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径。(两条路径不经过相同的边)(注,无向图中不存在重边,也就是说确定起点和终点,他们之间最多只有1条路)这个题目,我们看到是一个无向图。可以转换成有向图之后再来处理。我们可以想到,两个点因为本来是无向的转化成有向的之后,那么看有没有两条不相交的路径就是看这原创 2016-05-11 11:41:54 · 744 阅读 · 0 评论 -
求解二叉树中两个节点的最近公共祖先(LCA)
/************************************************************************//* 非递归的方法下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题1) 找到从根到n1的路径,并存储在一个向量或数组中。2)找到从根到n2的路径,并存储在一个向量或数组中。3) 遍历这两条路径,直到遇到一个不同的节点,则前面的原创 2016-05-10 21:44:55 · 1932 阅读 · 0 评论 -
根据前序遍历和中序遍历构建二叉树以及根据中序遍历后序遍历构建二叉树
/************************************************************************//* 算法说明:由中序遍历序列可知,第一个节点是根节点,由前序遍历序列可知,第一个节点是根节点的左子树节点,而且前序遍历中,根节点左边是左子树,右边是右子树,因此通过中序遍历的根节点可以确定的是:根节点在前序遍历中的位置(通过遍历前序遍历原创 2016-05-10 21:07:12 · 1030 阅读 · 0 评论 -
CUGOJ 1682
经过一段时间的学习后,张同学发现小胡数学非常棒,于是决定追求数学成绩很好的女生小胡。小胡其实是想拒绝他的,但是小胡找不到好的说辞,于是提出了这样的要求:对于给定的两个正整数N和M,张同学随机选取一个N的因数Nf,小胡随机选取一个M的因数Mf,如果Nf和Mf相等,她就答应张同学。小胡让张同学去编写一个随机程序,到时候她看过程序没有问题了就可以用来抽签了。但是张同学写着写着,却越来越觉得机会渺茫。原创 2016-05-09 15:59:31 · 1030 阅读 · 0 评论 -
CUGOJ 1681 求解最长回文字符串
Manacher算法:求解最长回文字符串,时间复杂度为O(N)这一个题目因为对于所有的数据,满足1,字符串长度字符串的长度很长,不能使用我们平时使用的类似于dp的开两维数组的解法,所以我们只有一种专门来求解这一类问题的解法,Manacher算法:求解最长回文字符串,时间复杂度为O(N)。#include #include #include #include #inclu原创 2016-05-09 15:55:54 · 445 阅读 · 0 评论 -
51nod1119 机器人走方格 组合数学
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。题目本身很简单,就是一个初中都推倒过的理论,只能向下或者向右的话,那么可能的路径一共有C(n+m,n)种。很好理解的这里就不说明了。现在我们要解决的是,当n和m都比较大的时候怎么讲结果计算出来。#include原创 2016-05-05 16:27:30 · 1496 阅读 · 0 评论 -
51nod 1066 Bash游戏
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。例如N = 3,K = 2。无论A如何拿,B都可以拿到最后1颗石子。Input第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1原创 2016-05-04 20:47:45 · 610 阅读 · 0 评论 -
51nod 1069 Nim游戏
有N堆石子。A B两个人轮流拿,A先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N及每堆石子的数量,问最后谁能赢得比赛。例如:3堆石子,每堆1颗。A拿1颗,B拿1颗,此时还剩1堆,所以A可以拿到最后1颗石子。Nim游戏。(Bouton's Theorem):对于原创 2016-05-04 20:20:00 · 820 阅读 · 0 评论 -
51nod 1072 博弈 威佐夫游戏
有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁能赢得比赛。例如:2堆石子分别为3颗和5颗。那么不论A怎样拿,B都有对应的方法拿到最后1颗。Input第1行:一个数T,表示后面用作输入测试的数的数量。(1原创 2016-05-04 15:42:46 · 412 阅读 · 0 评论 -
51nod1070 博弈
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。Input第1行:一个数T,表示后面用作输入测试的数的数原创 2016-05-03 16:39:09 · 558 阅读 · 2 评论 -
51nod1068 博弈
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量只能是2的正整数次幂,比如(1,2,4,8,16....),拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。例如N = 3。A只能拿1颗或2颗,所以B可以拿到最后1颗石子。(输入的N可能为大数)Input第1行:一个数T,表示后面用作输入测试的原创 2016-05-03 14:57:22 · 991 阅读 · 0 评论 -
51nod 1067 博弈
有一堆石子共有N个。A B两个人轮流拿,A先拿。每次只能拿1,3,4颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。例如N = 2。A只能拿1颗,所以B可以拿到最后1颗石子。Input第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行1个数N。(1原创 2016-05-03 14:25:57 · 487 阅读 · 0 评论 -
51nod1417 博弈
多年后,每当Noder看到吉普赛人,就会想起那个遥远的下午。Noder躺在草地上漫无目的的张望,二楼的咖啡馆在日光下闪着亮,像是要进化成一颗巨大的咖啡豆。天气稍有些冷,但草还算暖和。不远的地方坐着一个吉普赛姑娘,手里拿着塔罗牌,带着耳机,边上是她的狗。狗看起来有点凶,姑娘却漂亮。Noder开始计算各种搭讪方式的成功概率,然而狗的存在......。奇怪的事情发原创 2016-05-02 16:55:26 · 588 阅读 · 0 评论 -
51node1091 线段的最长交集(贪心)
X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。排序之后直接贪心就可以了。#include #include #include #include原创 2016-05-02 15:24:43 · 1106 阅读 · 0 评论 -
poj1979 简单bfs
题意:就是给一个矩形,由.和#还有@组成,#不能走,然后一个人站在@处,问这个人最多可以走的位置有哪些。一个简单的bfs,然后看vis数组里面有多少个位置被标记就可以了。#include #include #include #include #include using namespace std;int const maxn = 25;char st原创 2016-04-30 10:56:28 · 412 阅读 · 0 评论 -
hdu5672 找字符串的子串问题
题目:给一个字符串,问有多少个子串至少含有k个不同的字母?有一个明显的性质:如果子串(i,j)包含了至少m个不同的字符,那么子串(i,k),(j因此对于每一个左边界,只要找到最小的满足条件的右边界,就能在O(1)时间内统计完所有以这个左边界开始的符合条件的子串。寻找这个右边界,是经典的追赶法(尺取法,双指针法)问题。维护两个指针(数组下标),轮流更新左右边界,同时累加答案即可。原创 2016-04-28 16:49:11 · 655 阅读 · 0 评论 -
hdu_5671 矩阵行列移动等
有一个nn行mm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1≤n≤1000,1≤m≤1000),在这个矩阵上进行qq (1 \leq q \leq 100,000)(1≤q≤100,000) 个操作:1 x y: 交换矩阵MM的第xx行和第yy行(1 \leq x,y \leq n)(1≤x,y≤n);2 x y: 交换矩阵MM的第xx列和原创 2016-04-26 18:40:03 · 622 阅读 · 0 评论 -
hdu_5670 进制问题+数学水题
有一个机器,它有 m (2\leq m\leq 30)m(2≤m≤30) 个彩灯和一个按钮。每按下按钮时,最右边的彩灯会发生一次变换。变换为:1. 如果当前状态为红色,它将变成绿色;2.如果当前状态为绿色,它将变成蓝色;3.如果当前状态为蓝色,它将变成红色,并且它左边的彩灯(如果存在)也会发生一次变换。初始状态下所有的灯都是红色的。询问按下按钮 n (1\leq nn(1≤n2原创 2016-04-26 16:22:17 · 375 阅读 · 0 评论 -
hdu 5661 异或
两个区间,(a,b)和(c,d),数据范围为long long ,在这俩个区间里面各选取一个数字求异或,求最大的异或值。官方题解:考虑从高位到低位贪心,对于每一位,如果x,y只有唯一的取法,那么只能这么取;否则贪心地必须使答案的这一位等于1。如果x,y都是0,1都能取,则设这是从右向左数第len位,因为x,y能取的值一定都是连续的一段,因此x,y的后len位都能取0原创 2016-04-25 17:11:41 · 513 阅读 · 0 评论 -
hdu5666 (数学水题)
标准解释:考虑一条以(0,0)(0,0)为起点,(x,y)(x,y)为终点的线段上格点的个数(不包含端点时),一定是gcd(x,y)-1gcd(x,y)−1,这个很显然吧.然后整个网格图范围内的格点数目是\frac {q*(q-1)} 22(q-1)∗(q−2).所以答案就是\frac {q*(q-1)} 2 -2q-1)∗(q−2)− 所有线段原创 2016-04-22 12:01:07 · 601 阅读 · 0 评论 -
字符串的一些基本操作,复制,长度,子串查找,单词反转,比较,字符串反转,删除指定字符。
#include #include #include #include #include #include #include using namespace std;#define maxn 10005//实现strSrc到strDest的复制char *strCpy(char * strDest , char * strSrc){ if(strSrc==NULL||s原创 2016-04-12 17:30:07 · 831 阅读 · 0 评论 -
51nod 1428 (贪心+优先队列)
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input第一行一个正整数n (n <= 10000)代表活动的个数。第二行到第(n + 1)行包含n个开始时间和结束时间。开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000Output一行包含一个整数表示原创 2016-04-08 11:23:17 · 695 阅读 · 0 评论 -
51nod1099 贪心
有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] 例如:执行需要5个空间,最后储存需要2个空间。给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间。题目意思刚开始有点不懂,但是又好像懂了就开始写。然后知道肯定是排序,一开始觉得是按照r排序,r越大越先执行这样看好像是需要的空间最原创 2016-04-06 11:18:41 · 470 阅读 · 0 评论 -
51nod 1117(贪心+优先队列)
一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN(1 木匠发现,每一次切割花费的体力与该木棒的长度成正比,不妨设切割长度为1的木棒花费1单位体力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,则木棒原长为12,木匠可以有多种切法,如:先将12切成3+9.,花费12体力,再将9切成4+5,花费9体力,一共花费21体力;还可以先将12切成4+8,原创 2016-04-05 21:22:24 · 402 阅读 · 0 评论 -
51nod 1163 (贪心+优先队列)
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。分析:首先可以将所有完成时间截止日期大于n的任务的截止日期置为n,这是因为遍历完所有的任务只需要n步,所以只需要的时间为n,当截止日期大于n的时原创 2016-03-23 20:10:46 · 632 阅读 · 0 评论 -
51nod 1182(简单贪心)
约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。简单题,直接统计每个字符出现的次数然后依次从大到小赋值26,2原创 2016-03-22 17:04:48 · 342 阅读 · 0 评论 -
51nod 1191(贪心+优先队列)
有N只兔子,每只有一个血量B[i],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D[i],价格为P[i](1 特别说明:1、当箭的伤害值大于等于兔子的血量时,能将兔子杀死;2、血量B[i],箭的伤害值D[i],箭的价格P[i],均小于等于100000。分析:贪心+优先队列。将兔子排序之后在将弓箭按伤害值排序,之后从大到小枚举兔原创 2016-03-22 16:33:57 · 439 阅读 · 0 评论 -
51nod1432 贪心
上船问题。排序之后枚举最大重量就可以了。#include #include #include #include #include #include #include #include using namespace std ;#define mem(a) memset(a,0,sizeof(a))#define inf 100000005int c原创 2016-03-19 13:08:43 · 300 阅读 · 0 评论 -
hdu 1165 递推
题目:As is known, Ackermann function plays an important role in the sphere of theoretical computer science. However, in the other hand, the dramatic fast increasing pace of the function caused the val原创 2016-03-15 17:28:39 · 384 阅读 · 0 评论 -
hdu 1561 (树形dp+依赖背包)
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?分析:和依赖背包有些类似,就是想要取一个值的时候要先取一个其他的值。 这个题目明显可以先根据依赖原创 2016-03-13 18:43:55 · 483 阅读 · 0 评论 -
51nod 1043
题意:求在2*n位的数字中,前n位的和等于后n位的和的个数,比喻n=1的时候,11,22,33...99等数字都是的,还有1102,2121等都是满足要求的数字。n分析:数位dp题目,这道题目想了很久,刚开始以为是dp[i][j] 表示的是前 i 位数字和后 i 位数字的差为 j ,是这样的。结果递推方程想了很久也没有一个统一的结果,需要一个一个的来推,倒是大概好像有一个统一的想法,原创 2016-03-12 21:14:14 · 613 阅读 · 0 评论