ACM之路
感性的茄子E
重剑无锋大巧不工.我的新浪微博:感性的茄子E
展开
-
流网络浅析 By ACReaper
关于网络流,整整花了我一天时间,才看懂它再讲解什么,为了让初学者能更好理解,我打算写篇关于流网络的文章。1.流之网络最大流模型所谓的流网络其实也是图论的一部分,流网络是这样定义的,其每条边上都有两个值,一个称为flow流值,一个称为capacity,表示可通过的最大流值。而,问题是这样的,在现实世界中,我们可以建立很多这样的模型,有一个起始点,我们称它为源点,还有一个点称为汇点原创 2013-05-02 15:29:11 · 738 阅读 · 0 评论 -
生成下一个排列 By ACReaper
生成下一个排列的算法有很多中,用递归来实现是最简单,最明了的。我下面介绍的不是按照递归了实现而是从实际问题分析,总结出的规律。我们知道对于排列a1a2a3......an,如果aj 怎么判断,下一个排列的条件,这里我们贪心点,我们选择最后一个满足aj 一个刚好是,接着我们从第j+1,n位中选择大于aj最小的ak,把它和aj交换,这时从j+1位开始,依然保持着递减的次序,所以我们把它按照原创 2013-04-30 23:13:43 · 1017 阅读 · 0 评论 -
图的多源点最短路问题和传递闭包之Floyd-Warshall算法 By ACReaper
我们知道求图的最短路有Dijkstra应用于无负权的算法,也有应用于有负权的Bellman0-Ford算法,但是当源点有多个呢?难道我们要调用n次的Dijkstra算法?有没有其它的算法呢?这是当然的,Floyd-Warshall就是用来解决这个问题的,也许有学过的人会说这个算法的效率太低,为O(n^3)但是,当摊销到每一条路上时,其效率为O(V)还是很高的,很实用的一个算法。Floy原创 2013-04-30 22:33:57 · 1246 阅读 · 0 评论 -
扩展欧几里德算法(数论初步) By ACReaper
扩展欧几里德算法主要用来求ax + by = d这样的等式的整数解,当且仅当gcd(a,b) = d时该算法可直接求该等式,当gcd(a,b) != d时,可先求ax + by = gcd(a,b),然后按照进行值统一法,见解求解。首先统一如下知识1. a mod b = a - floor(a / b) * b其实这个等式只是用数学语言描述的很严格,我们以前上小学时就学过了怎么计算除原创 2013-04-20 23:22:40 · 623 阅读 · 0 评论 -
物品无限的背包问题(贪心算法) By ACReaper
waiting........................................原创 2013-04-16 12:18:35 · 1061 阅读 · 0 评论 -
无平方因子的数(数论初步) By ACReaper
题目:给出正整数n和m,区间[n,m]内的“无平方因子”的数有多少个?整数p无平方因子当且仅当不存在k > 1,使得p是k * k的倍数。1 思路分析: 分析最坏情况[1, 10 ^ 12],如果一个个判断的话,显然时间太大,就算如题意m - n最大值为10 ^ 7,那样也会超时,所以我们考虑其它方法,即筛选法,考虑这中方法时,我们要把题目中的条件做一下逆向转换,也就是说对于原创 2013-04-20 16:35:12 · 4967 阅读 · 4 评论 -
杨辉三角与二项式定理(排列与组合) By ACReaper
由帕斯卡恒等式我们可以很轻易的总结出杨辉三角形的规律,其实这个三角形也叫帕斯卡三角形。帕斯卡i恒等式:即(n + 1)(k) = (n)(k) + (n)(k - 1),这个恒等式很好证明也很容易理解,我们采用组合证明来证明它,对于某集合有n + 1个元素,求其有k个元素的子集个数即为(n + 1)(k),我们假设a是这个集合的元素,则a要么选进这k个元素,要么不选,根据加法定理就有(n原创 2013-04-21 16:19:55 · 915 阅读 · 0 评论 -
离散概率初步 By ACReaper
waiting原创 2013-04-21 16:23:13 · 617 阅读 · 0 评论 -
编码与解码(数论中的计数问题) By ACReaper
waiting原创 2013-04-21 16:22:38 · 707 阅读 · 0 评论 -
同余与模运算(数论初步) By ACReaper
First:我们有如下公式:(a + b) mod n = ((a mod n) + (b mod n) ) mod n;(a - b) mod n = ((a mod n) - (b mod n) + n) mod n;ab mod n = (a mod n)(b mod n)mod n注意第二个表达式,因为a mod n - b mod n可能为负数,所以要加原创 2013-04-21 11:17:04 · 757 阅读 · 0 评论 -
UVA 10986 By ACReaper
这题太水了,就不分析了。直接代码#include #include #include using namespace std;const int maxn = 20006;const int INF = 0x6fffffff;typedef pair pii;priority_queue,greater >q;vector g[maxn];void Dijkstra(int原创 2013-05-15 22:06:25 · 593 阅读 · 0 评论 -
组合的生成之生成下一个组合 By ACReaper
生成下一个组合,其实原理很easy,听我慢慢道来也~在集合{1,2,3,4,...N}中生成r组合。我们假设当前生成的是{a1,a2,...ar},则当可以生成下一个组合时的极限条件就是ar还没达到最大那么ar继续加1,就是下一个组合,如果ar达到最大了,那么此时就要ar-1看是否达到最大,没有则加一,又因为a1 < a2 <.... < ar,也就是说接着在把后面的数都一次比前面一个数大一加原创 2013-05-03 15:57:31 · 818 阅读 · 0 评论 -
ACM总结 by fennec@JLU
ACM总结(fennec)其实在北京比赛完的时候,我就想写了,不过还是早了点,直到上海比赛结束,大家的心中都不是太好受。郭老师有句话:你们这样做也是对的,不成功就成仁。让我的心也能安慰了不少。我是从大一下学期开始接触ACM的,那时候我们学校才刚刚起步,siyee,wjiang师兄可以说是我的领路人了,冲名次,比做题真是一种幸福的感觉。大二上学期很有幸与siyee队长,jack学长一起代表学校转载 2013-07-02 13:18:31 · 1103 阅读 · 0 评论 -
UVA 558 判断负环 By ACReaper
哎,好久没切题了,今天又来切题鸟,一定要坚持!!!至少每天一题!这题本质就是判断图中有没有负环。我的第一反应就是用Bellman-ford算法解决,代码如下#include #include #include using namespace std;typedef pair pii;const int maxn = 1006;const int INF = 0x2fff原创 2013-05-30 23:50:20 · 666 阅读 · 0 评论 -
Vim 基本配置
Vim基本配置 设置工作目录为当前编辑文件的目录set bsdir=bufferset autochdir编码设置set enc=utf-8set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936语言设置set langmenu=zh_CN.UTF-8language message转载 2013-05-29 23:39:30 · 1601 阅读 · 0 评论 -
UVA 10801 By ACReaper
Problem ?Lift HoppingTime Limit: 1 secondTed the bellhop: "I'm coming up and if there isn'ta dead body by the time I get there, I'll make onemyself. You!"Robert Rodriguez,原创 2013-05-15 22:13:03 · 714 阅读 · 0 评论 -
uva 10369 By ACReaper
#include #include #include using namespace std;const int maxn_v = 1024;const int maxn_e = maxn_v * (maxn_v - 1) / 2;int u[maxn_e];int v[maxn_e];double w[maxn_e];int r[maxn_e];int fa[maxn_v];原创 2013-05-09 01:10:19 · 591 阅读 · 0 评论 -
uva 10369 By ACReaper
#include #include #include #include using namespace std;const int maxn_b = 755;const int maxn_e = maxn_b * (maxn_b - 1) /2;struct pos{ double x,y;};pos A[maxn_b];int p[maxn_b];int u[maxn_e原创 2013-05-09 01:08:50 · 622 阅读 · 0 评论 -
UVA 10034 By ACReaper
#include #include #include #include using namespace std;const int maxn = 15024;int u[maxn];int v[maxn];double w[5 * maxn];int r[5 * maxn];int fa[maxn];struct pos{ double x,y;};pos A[maxn原创 2013-05-07 02:38:00 · 597 阅读 · 0 评论 -
Graveyard NEERC 2006,LA 3708 By ACReaper
#include #include using namespace std;int main(){ int n,m; while(scanf("%d%d",&n,&m) == 2){ double ans = 0.0; for(int i = 1; i < n; i++){ double pos = (double)i / n * (n + m);//个数得即为距离的反比,原创 2013-05-06 23:47:12 · 791 阅读 · 0 评论 -
Uva 11300 By ACReaper
这道题真的是太妙了!模型的转化,建立确实重要!学习了。定理1.对于线段上的点,其中点到所有点的距离之和为最短。证明:点数为偶数,则在中间两点见的任意位置移动,距离都不变!(可取偏左,偏右都一样) 点数为奇数,则中间点本来就存在,改点即为中间点某型的建立:设xi表示第i点给第i - 1点的金币。则最小金币数即是|x1| + |x2| + ....原创 2013-05-06 12:54:25 · 646 阅读 · 0 评论 -
UVA 567 By ACReaper
这道题目,坑死我了,特别是数据输出的时候有句话 The test result line should contain the start country code A right-justified in columns 1 and 2; the string `` to " in columns 3 to 6; 呜呜,害哥格式错误,找了个半天,你妈呀!!!。题目的大意思就是给你一个图,求任原创 2013-05-04 16:30:05 · 791 阅读 · 0 评论 -
直线上的点(数论初步) By ACReaper
首先我们由欧几里德拓展算法可以求得一组解(d,x,y),而这组解通过与ax + by + c = 0中的c / d,如果c是d的倍数则这个点是直线上的一个解。分析:设a,b,c为任意整数,g = gcd(a,b),方程ax + by = g的一组解是(x0,y0),则当c是g的倍数时ax + by = c的一组解是(x0*c/g,y0*c/g),当c不是g的倍数时无整数解。接着我们由这原创 2013-04-21 11:15:48 · 807 阅读 · 2 评论 -
Huffman算法(贪心算法) By ACReaper
终于把Huffman算法实现了 #include #include #include typedef struct huffman{ int weight; int parent,lchild,rchild;}HTNode,*HuffmanTree;int n;char buf[MAX_LEN];void HuffmanCoding(HuffmanTree &HT,int原创 2013-04-08 23:33:19 · 715 阅读 · 0 评论 -
简单素数筛选法介绍(数论初步) By ACReaper
我们介绍一下素数筛选法。给你1---n的连续整数,把这些数中的素数筛选出来,用到的思路很简单。其原理基于,对于数p如果p的倍数存在与表中,则这个p的倍数一定不是素数,我们可以把它删除,但是这样删除的干净吗?这是个好问题,我们可以从小到大,从2开始枚举,至于1为什么不行,想想也应该能明白吧,然后可以用数学归纳法证明,当结束时,整张表必然是素数表,因为除了1和它本身,没有其它的数能整除。原创 2013-04-20 17:39:09 · 773 阅读 · 0 评论 -
选择不相交区间(贪心算法) By ACReaper
题目的分析被说得有点绕。自己理解是这样,首先由题目我们知道选择的区间都是相互不相交的,除这之外,我们的目标是尽量的让选择的区间达到最大化。所以我们可以先对齐排序,因为输入是随机的。假设每个区间表示为(x,y)我们可以选择按照x排序所有区间,也可以选择按照y来排序所有区间。而不管选择哪一个来排序,其原理和本质都一样,都是为了方便操作,将其有序化。我们这里选择按照y来排序,排序完后有y1原创 2013-04-05 23:09:59 · 2594 阅读 · 2 评论 -
最小生成树之Kruskal算法(图论) By ACReaper
这是利用并查集实现的比较高效的Kruskal算法,用于算出最小生成树的权!注意该算法并没有维护最小生成树的形态,而只是算出其权值而已,所以离实际应用还有距离!#include #include #define MAXN 1000int v[MAXN];int u[MAXN];int w[MAXN];int p[MAXN];int r[MAXN];int n,m;i原创 2013-04-23 23:21:33 · 664 阅读 · 0 评论 -
表达式树(图论) By ACReaper
形如6*(2+3)+9计算其值,要是在面向对象的语言中,用脱窗口的方法是很好解决的,是不。不过我们要写的是算法。思想:通过观察表达式我们可以发现一个规律,就是我们可以先找到最后运算的符号,然后计算其左边,其右边,接着把它连接如符号计算。这个思想和简单,也很容易理解,其实这个思想所建立的树也就是后缀树。代码实现如下:#include #include cons原创 2013-04-23 10:58:22 · 649 阅读 · 0 评论 -
无根树转为有根数(图论) By ACReaper
给结点分别编号,输入这个无向图的的边,它只有n - 1条边,所以本质上也是树,但是我们还没有确定树的root的结点,下面我们来构造一颗树。我们用邻接矩阵来存下整个图,这里用C++里的vector这中数据结构,它是可以变长的,所以存下之后,空间复杂度就不是n * n了,而是n。给出一组数据:一共8个结点,从0----7编号。我们假定以1为根结点构建树。边数据如下:0原创 2013-04-22 14:47:01 · 2448 阅读 · 0 评论 -
模线性方程(数论初步) By ACReaper
与直线上的点本质一样,不再写了。原创 2013-04-21 11:18:54 · 545 阅读 · 0 评论 -
硬币问题之记忆化搜索-动态规划 By ACReaper
#include #include #define MAXLEN 10001#define COINLEN 101int V[COINLEN];int vis[MAXLEN];int d[MAXLEN];int n;int dpmax(int s);int dpmin(int s);int main(){ int s; while(scanf("%d%d",&n,&s) !原创 2013-04-12 13:36:24 · 601 阅读 · 0 评论 -
poj 1504
题目:意思是给任意的两个数,要你求出其两个数颠倒过来的数相加的结果,然后在颠倒输出,题目保证输入不会出现1200这种颠倒后会失去0的数,但是不保证结果首位不为0.分析:1.题目没有给出相加两个数的数据范围,所以不要用int,因为数据可能超出int范围,所以考虑用数组来存大数。 2.分析题目可知,要求的结果,两次颠倒,类比下负数,负负得正,也就是说,我们可以不用原创 2012-12-17 22:08:19 · 431 阅读 · 0 评论 -
除法表达式(数论初步) By ACReaper
这道题目,读了许久,都没明白过来为什么判断表达式的值能否为整数,只要判断E = x1/(x2/x3/....xk) = x1 * x3 * ...*xk / x2是否为整数。后来才明白,其实是这样的,无论你怎么加括号下x2都必然在分母位置,要证明这个可以用数学归纳法去证明,这里不再证明,但你可以试试几个,稍微验证一下。而且其它的数都可以放在分子位置因为我们都可以这样加括号x1/(x2/x3....原创 2013-04-20 16:34:14 · 1065 阅读 · 0 评论 -
QuickSort简解(分治思想) By ACReaper
快排又称为快速排序算法快熟排序主要思想为:递归而分,重于分而治,而简与合。治:int partition(int A[],int st,int ed){ int key = A[st];//把第一个元素作为支点 int j = st;//j一直指向小于等于key一类的尾元素 for(int i = st + 1; i <= ed;i原创 2013-03-23 16:05:52 · 557 阅读 · 0 评论 -
小于n且与n互素的个数(数论中的计数问题) By ACReaper
waiting原创 2013-04-21 16:22:00 · 924 阅读 · 0 评论 -
幂取模(数论初步) By ACReaper
所谓的幂取模就是a ^ n mod m的值。(m 小于a ^n的位数)我们可以很容易想到对于要计算这个可以采用分治思想,优化算法,也就是计算a ^ n,我们只需要计算 a ^ n/2依次类推,于是有如下代码:#include int pow_mod(int a,int n,int m){ if(n == 0) return 1 % m; if(n == 1)原创 2013-04-21 11:18:14 · 708 阅读 · 0 评论 -
大整数取模(数论初步) By ACReaper
#include #include #define MAXN 1000char n[MAXN];int m;int main(){ scanf("%s%d",n,&m); int len = strlen(n); int ans = 0; for(int i = 0 ; i < len; i++){ ans = (int)(((long long)ans * 10 + n[原创 2013-04-21 11:17:44 · 701 阅读 · 0 评论 -
Dijkstra算法之优先队列优化版本 By ACReaper
Dijksta算法中,如果我们采用的是邻接矩阵来存的,第一点浪费的空间比较多,第二点我们知道算法的时间复杂度在O(n*n),这样的算法可以说并不是很好,所以我们考虑优化它,那么可以从哪些地方优化呢,首先我们可以优化存储结构,采用邻接表来存储,其次我们可以用优先队列来排序大小,其时间复杂度大大降低。代码如下。需要注意的是pair是按照第一个元素的大小排序,如果相同才按照第二个,所以我们要把d[i原创 2013-04-29 02:26:16 · 3663 阅读 · 0 评论 -
Bellman-Ford算法之计算含有负权值的图(但是不含权值为负的回路) By ACReaper
下面代码为最简单的Bellman-Ford算法的表示,可以用队列进行优化。#include #define MAXN 1000int u[MAXN + 1];int v[MAXN + 1];int w[MAXN + 1];int d[MAXN + 1];int n,m;int main(){ while(scanf("%d%d",&n,&m) != EOF){原创 2013-04-29 17:09:20 · 1291 阅读 · 0 评论 -
for循环中控制循环变量的总结 By ACReaper
在for循环中,我们有时会想要在for循环中多个地方,改变当前控制for循环变量的值,让它按照这个值重新循环。一个解决方法是,用一个布尔值isChangeI,在改变后没这个值设置为true,最后再用if(isChangeI)判断,如果为真,则变量减减,这是因为在这从循环结束时,变量i会自动加1,从而跳过了我们所期待的值,所以要修正偏差。我们将该细节问题称之为:for循环中,改变循环原创 2013-04-28 12:39:33 · 1598 阅读 · 0 评论