随笔分类 - acm进阶
摘要:问题大意: 1.有n个信封,同样有n封信; 2.这n个信都装错信封; 输出: 总共有多少种错排的方式; 题解: n个人的排列数是n的阶乘n!,随机选取m个人作为拿到自己礼物的一组,有Cnm种方法,假设用D(n-m)表示剩下的n-m个人全部拿错的方法数,那么答案就是: D(n) = (n-1) [D(
阅读全文
摘要:快速幂取模 用法:用于求解 a 的 b 次方,而b是一个非常大的数,用O(n)的复杂度会超时。但是这个算法的时间复杂度是O(log n). 那么假如让你求一个矩阵的很大的次方幂呢,当然我们同样可以求解。 可以参考dalao的博客: http://blog.csdn.net/y990041769/ar
阅读全文
摘要:判断素数的方法很简单: 然而有很多数的时候 ,很显然,如果从头选到尾,是非常耗费时间的。 所以用这个方法写的时候就显出了优势,就是省时。 先从小到大排序,把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为
阅读全文
摘要:对于双向队列,与队列queue以及vector容器的区别就在于,名字不同,也就是它是双向的,可以从头开始操作,也可以从末尾开始操作。 双向队列的常用方法跟队列queue差不多: 头文件: #include<deque> 函数: 构造/析构 deque<int>q 构造一个空的双向队列 deque<i
阅读全文
摘要:完全背包问题很简单,相对于01背包只有一点点的变化。 1.有n种不同的物体,有体积为m的一个背包; 2.n种物体分别有自己的体积v,价值c; (注意是“n种“,不是"n个”,所以每种物体不限个数,随便放多少) 输出: 背包中能装下的最大价值 题解: 首先将这n种物体的体积和价值存在两个不同的数组中(
阅读全文
摘要:01背包是动态规划中,最基础也是经典的一个算法之一。 经典题意: 1.有n个不同的物体,有体积为m的一个背包; 2.n个物体分别有自己的体积v,价值c; 输出: 在背包中能装的最大价值 题解: 首先将这n个物体的体积和价值存在两个不同的数组中(v[i],表示第i个物体的体积,c[i]表示第i个物体的
阅读全文
摘要:同样威佐夫也有一个经典的例题: 1.有两堆数量分别为 n,m个石子的石子堆; 2.两个人轮流取石子,可以在一堆石子中取任意个,或者,在两堆石子中每堆石子取相同数目的石子; 输出: 如果先手赢,输出1,否则输出0。 题解: 首先,当n=0,m=0时,先手输。 n=1,m=1时,先手赢。 n=2,m=1
阅读全文
摘要:对于这个博弈,有一种经典的例题: 1.只有一堆数量为n的石子; 2.只有两个人参与这个游戏; 3.两个人轮流取1--m个石子; 4.最先取完石子的人赢; 输出: 如果先手赢,输出1,否则输出0; 题解: 如果n=m+1,因为最多取m个。所以先手不论取多少个,后手都能一次拿完。 所以,要想先手赢 n=
阅读全文
摘要:1.除法 2.减法 跟除法的方式类似。 略。
阅读全文
摘要:大数自然不能用普通的int,或者long long.因为是肯定存不下的。所以就有两个选择,一个是通过字符串来进行运算,可以看之前的博客。 http://www.cnblogs.com/jaydenouyang/p/6482977.html 这里只介绍通过数组进行的运算。 1.加法 比如要求 1234
阅读全文
摘要:有A,B,C,三点,判断该3点为什么顺序排序。 利用矢量叉积判断是逆时针还是顺时针。 设A(x1,y1),B(x2,y2),C(x3,y3),则三角形两边的矢量分别是: AB=(x2-x1,y2-y1), AC=(x3-x1,y3-y1) 则AB和AC的叉积为:(2*2的行列式) |x2-x1, y
阅读全文
摘要:简单的次方求模很简单,就像上文一样。 不过比较难的就是大数的次方求余。 对于a^b mod c .令N=a^b. 所以 N mod c =(N1 mod c * N2 mod c * N2 mod N3 * ~~~Nn mod c ) mod c . 有了这个式子,所以: a^b=a^(b/2) *
阅读全文
摘要:其实同余定理很简单,只是两个等式: (a+b)%c=(a%c+b%c)%c; (a*b)%c=(a%c+b%c)%c; 对大数取余的模板(大数必须用string来存): string a; int m=0; for(int i=0;a[i]!='\0';i++) m=((m*10)%n+(a[i]-
阅读全文
摘要://前向星 #define N_node 1000 //点的个数 #define N_edge 5000 //边的条数 typedef struct //节点信息 { int to ,next; //to 点,next E中下标信息 int cost; //当前边的权值 }STAR; STAR E[
阅读全文
摘要:解决存在<<<负环>>>的图的单源最短路径: 判断有无负环: 如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图) 这里,只介绍用bfs(深搜)的SPFA,如果想了解更多,参考http://www.cnblogs.com/scau20110726/archive/2012/11/
阅读全文
摘要:只有五行的Floyd最短路算法: 核心代码 每次都更新通过k点,然后从i到j的最短路程。。。
阅读全文
摘要:一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。重点
阅读全文
摘要:并查集的基本操作有三个: 1. const int MAXSIZE = 500; int uset[MAXSIZE]; void makeSet(int size) { for(int i = 0;i < size;i++) uset[i] = i; } 2. 2.1 int find(int x)
阅读全文
摘要:母函数分为无限个,有限个。 有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案? 考虑用母函数来解决这个问题: 我们假设x表示砝码,x的指数表示砝码的重量,这样: 1个1克的砝码可以用函数1+1*x^1表示, 1个2克的砝码可以用函数1+1*x^2表示, 1个3克的砝码
阅读全文
摘要:在实际中最常用的一种排序算法,速度快,效率高。 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的
阅读全文