- 博客(53)
- 资源 (1)
- 收藏
- 关注
原创 [Spark浅析][1]概念及简单集群搭建
最近开始接触Spark,遇到了很多坑和困惑的地方,打算把它们写成一个文章系列,避免自己以后遗忘,更希望能帮助更多想学习Spark的人。本文所用的措辞若不另说明,则是根据自己的理解原创所得,具有一定的主观性,如果有的地方理解的不对还请各位不吝指出,在此感谢! 一、Hadoop MapReduce和Spark简介、二者的区别与联系 Hadoop MapReduce是一个分布式计算框架,稳定性好,普
2014-12-30 10:47:40
625
原创 HDOJ 2054 A == B ?
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2054 这道题坑特别多: 放几组数据: // 均为YES 0.0 0.00 -0 0 -0. +.0 0.1 00.10 4 4 +1 1 -1 -1.0 1.0 1.0 +.020 00.02 代码如下(主要练习string的iterator): #include #i
2013-12-31 22:01:21
884
原创 利用reverse_iterator删除string末尾元素
先看代码: #include #include using namespace std; int main() { string str = "Uranux~"; string::reverse_iterator strRIter = str.rbegin(); // 指向最后一个元素 string::iterator retIter = str.erase(--strRIter.
2013-12-31 21:53:05
1378
原创 C++隐式类型转换操作符
前几天看MFC时碰到了一个让我困惑不已的问题: CDC::Rectangle的某一个原型如下: BOOL Rectangle(LPCRECT lpRect); 其中LPCRECT是const RECT* 但是诸如如下所示的调用也能通过编译: myDC.Rectangle(CRect(p1, p2)); 其中CRect是RECT的
2013-11-26 22:47:45
919
原创 Codeforces Div.2 213 C Matrix (预处理+哈希)
超级传送门:http://codeforces.com/contest/365/problem/C 这场特别遗憾,A题题意看错WA了2次,C题溢出导致没能通过系统测试,如果C题过了就能排前30。 题意是给你一个长度不超过4000的数字s,定义b[i][j]=s[i]*s[j],则可以得到一个矩阵b;又给你一个数a,求b有多少个子矩阵其和为a。 例如: 10 12345 a=10,
2013-11-20 21:16:14
979
原创 [VC++深入详解] 1. Windows程序内部运行机制
本系列(VC++深入详解)为《VC++深入详解》(孙鑫 编著)读书笔记,很多例子都是仿照此书,很多概念也是来自此书,在对其做归纳总结的同时,也加入了自己的一些理解。 一、 最简单的Windows程序框架概览 #include #include LRESULT CALLBACK WndProc( _In_ HWND hwnd, _In_ UINT uMsg, _In
2013-11-18 22:08:01
3879
原创 Codeforces Div.2 212 C Insertion Sort (DP)
超级传送门:http://codeforces.com/contest/362/problem/C 这是一道以插入排序(Insertion Sort)为基础的动态规划题目,不熟悉插入排序请参考维基百科插入排序 题目中给的插入排序代码如下所示: for (int i = 1; i < n; i = i + 1) { int j = i; while (j > 0 && a
2013-11-15 23:56:31
785
原创 HDOJ 3183 A Magic Lamp
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题意要删除m个数字,我们不妨是认为只能挑选n-m个数字,使得有序组合得到的数字最小。 我们先来挑第一个,范围是原数的1~n-(n-m-1)即1~m+1 (注意要给后面的数字至少每个保留一个位置,此处下标从1开始计)。 当然我们要在此区间里挑一个最小的数,假设这个数的位置是x,则接
2013-09-20 23:19:58
608
原创 用bis和bic实现所有位级操作
在Digital Equiment 的VAX计算机中,只有两种对位的操作函数:位设置bis和位清除bic。 其中bis(x, m)表示对于m中为1的位,置x对应的位为1. bic(x, m)正好相反,对于m中为1的位,置x对应的位为0。参数m有个更常用的称谓——掩码。对于掩码你一定不陌生,子网掩码、颜色掩码... 简单地说,掩码就是个过滤器,滤掉我们不希望得到的东西。 好了,扯远了,言归正
2013-03-27 22:31:21
2580
原创 ZOJ 3430 Detect the Virus(AC自动机+解码)
超级传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 本题思路清晰,不过解码确实繁琐,看来自己代码能力还有待加强。 需要注意几个点:解码后的ASCII字符的范围是0~255,而且可能包含'\0',不能用char来存,最好用int。 代码: #include #include #
2013-03-13 20:21:01
1049
原创 Trie引发的血案——再论参数
看到标题,或许聪明的你会说,参数不就那么回事吗?还要“再论”? 在决定写这篇文章之前,我也是这么认为的,自认为对C/C++的参数传递以及压栈方式了如指掌。 但是总有一些细节,在我们不注意的瞬间,给我们一个深刻的教训。 以前自己写Trie,用的是静态内存,不够灵活,虽然ACM/ICPC或其他算法竞赛都会给出严格的数据范围,避免越界。但是在实际项目中,没有人会知道,没有人能够预测自己
2013-03-07 19:50:23
843
原创 HDOJ 4333 Revolving Digits(KMP+扩展KMP)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4333 本题需要注意一点,需要统计的只是不重复的数字,所以先要用KMP求出串的循环节,然后只取一个周期进行匹配就行。用扩展KMP进行匹配,母串为输入串的两倍扩展(便于表示循环位移),在匹配的过程中判断大小。 代码如下: #include #include using n
2013-03-04 22:39:33
768
原创 HDOJ 4300 Clairewd's message(扩展KMP)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4300 本题题意是给你一个字符对应表,再给一个密文和明文相连接的串(明文后缀可能缺失),求补全后的串。 比如样例: abcdefghijklmnopqrstuvwxyz abcdab 为了方便,字符对应表是默认的。abcdab便是密文和明文相连接的串,记长度为m,我们需要找到分割点
2013-03-04 20:20:13
624
原创 POJ 1226 Substrings(KMP+枚举)
超级传送门:http://poj.org/problem?id=1226 题意要求一个最长的串X,其或其反转串rev(X)在所有串中均出现过,输出X的长度。 思路:先枚举第一个字符串的所有字串和字串的反转串,与剩下字符串进行串匹配,匹配过程中若二者有一个匹配成功则视为成功,从最长的字串开始枚举,第一个成功匹配的字串即为答案。 代码(注意reverse函数调用的位置,我之前多调
2013-02-23 20:29:09
467
原创 POJ 2185 Milking Grid(二维KMP)
超级传送门:http://poj.org/problem?id=2185 这道题网上很多其他的blog上的题解都是错的,由于题目自身数据比较水,便都混过去了。其中一种典型的错误解法是求出每一行/列的最小覆盖长度(ABCAB的最小覆盖长度就是3,即对应ABC),然后LCM,若结果大于串长,则取串长。这是一种典型的错误贪心,诸如: 2 8 ABCDEFAB AAAABAAA 这组数据
2013-02-23 18:29:32
1198
原创 线性时间复杂度字符串变换算法
在之前的一篇文章(百度2013年校招笔试题——pszStringRotate)中,我介绍了一种时间复杂度O(n),空间复杂度O(1)的字符串循环位移算法,其核心思想是交换和冲突处理。 其实这只是线性时间复杂度字符串变换算法的一个特例——变换函数为f(x) = x + offset (offset为偏移,取全体整数)。倘若存在一个更一般的变换函数f(x),f(x)不一定是线性函数,甚至不可导或者不
2013-02-12 14:33:34
685
原创 Project Euler 54 Poker hands(模拟+hash)
超级传送门:http://projecteuler.net/problem=54 刚看到题目描述,就联想到天津Regional的A题麻将那题,可惜没能AC,遗憾了好久。 这题比麻将那题要简单一些,规则描述比较清楚,要比较两手梭哈牌的大小,我用了hash来存牌,定义了各种判定判断函数来进行判断。 代码量还是比较大的,差不多600行,写的过程中很容易错。Unix/Linux设计思想——小即
2013-01-25 19:32:48
829
原创 Project Euler 51 Prime digit replacements(枚举)
超级传送门:http://projecteuler.net/problem=51 这题我是暴力枚举的,O3优化后2秒多。 先枚举素数,再枚举要替换的位置,我用二进制来表述,设dc为当前枚举到素数的位数,则替换方法可以从1 ~ (1 代码如下: #include #include #include using namespace std; int p
2013-01-25 19:16:00
1031
原创 Project Euler 38 Pandigital mutiples(枚举)
超级传送门:http://projecteuler.net/problem=38 枚举每个排列,分别判断是否合法,最大的排列即为答案。 注意从918273645开始枚举即可,因为这是题目中告诉的一组解,要找比这组解更大的才行。 先枚举n的值,从2到9,再枚举要乘的那个数,记为x,枚举x的位数即可,1~4,x的位数不可能大于4,如果大于4,那么2x的位数必然也大于4,组合起来长度会大于
2013-01-17 21:29:26
543
原创 Project Euler 26 Reciprocal cycles(计算有理小数循环节长度)
超级传送门:http://projecteuler.net/problem=26 算法的核心思想:在除法过程中如果某一状态的除数与被除数和前面某一状态的相等,则后续的除法计算陷入循环,循环节长度就是这两个状态的距离。 例子:计算1/7的循环节长度 状态1: 10/7 得1余3 状态2: 30/7 得4余2 状态3: 20/7 得2余6 状态4: 60/7 得8余4 状
2013-01-15 14:47:14
1460
原创 Project Euler 20 Factorial digit sum(大数乘法)
超级传送门:http://projecteuler.net/problem=20 用了自己写的大数乘法模板,乘法模板利用了这儿介绍的加法模板,注意设定内部tmp和ans数组的大小。 #include #include #include using namespace std; void add(char* des, char* src) { char tmp[
2013-01-15 14:35:22
615
原创 Project Euler 13 Large sum(大数加法)
超级传送门:http://projecteuler.net/problem=13 自己写的大数加法模板,用的时候注意设定tmp数组适当的长度,避免溢出或浪费空间。 #include #include using namespace std; char num[150][51] = { "3710728753390210279879799822083759024651
2013-01-15 14:30:12
821
原创 我浅浅驻足,徒留深深缠绵
夜深人静,无意间打开了一个叫ITer的人人小站,在其主页看到这么一段文艺代码: #include void main() { double world; unsigned letter; short stay; long memories; printf("I miss you.\n"); } 于是把它翻译成了四个版本,雅俗共赏: 在两个
2013-01-01 22:19:54
1280
原创 百度2012年校招笔试题——pszStringRotate
百度2013校园招聘笔试题 算法与程序设计 第4题: 字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)。 字符串位移,再简单不过了,方法也很多. 有朴素算法(逐位移动,移动nCharsRotat
2012-11-01 23:15:18
3013
原创 HDOJ 1754 I Hate It(线段树)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 分析:用线段树来保存学生成绩,每次更新区间最大值即可。 代码: #include #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 const int maxn = 200000; char cmd[2]; int
2012-08-11 23:44:58
510
原创 HDOJ 2852 KiKi's K-Number(树状数组)
超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意:有一个容器里有m个数(1 分析:用树状数组来维护这个容器,每次查找用二分。 代码: #include #include using namespace std; const int maxn = 100010; int c[maxn]; int n; in
2012-08-11 23:23:52
1554
原创 POJ 3321 Apple Tree(DFS+树状数组)
超级传送门:http://poj.org/problem?id=3321 题意:有一棵苹果树,每个分叉的交点或者末端刚开始都长有苹果,这些苹果可以被吃掉,也可以再长出来,但是每个位置上同时最多只有一个苹果。现在要查询指定的某棵子树上的苹果树。 分析:典型的树状数组求和问题,但是刚看题感觉很棘手,如何把一棵树映射到树状数组里?这里采用DFS改时间戳的方法,记两个数组begin和e
2012-08-11 23:09:30
469
原创 POJ 2029 Get Many Persimmon Trees(二维树状数组)
超级传送门:http://poj.org/problem?id=2029 题意:一块W*H的矩形区域,每一小块可能有柿子树,让你用一个S*T的矩形选择,问最多能选中几棵柿子树。(注意S和T不能倒置,题目给你3 5和5 3是不一样的做法)。 分析:典型的二维树状数组,枚举矩形起点,求和,取最大值,注意边界。 代码: #include #include using na
2012-08-11 22:56:33
422
原创 POJ 1990 MooFest(树状数组)
超级传送门:http://poj.org/problem?id=1990 题意:X轴上有N头牛(1 分析:用两个树状数组,一个用来存放当前位置左侧牛的个数,另一个存放左侧牛的横坐标。利用排序可以巧妙地避开max(v[i],v[j])的计算,先按照v从小到大对牛排序然后再依次插入树状数组,不影响结果。这样的话每次计算左侧的时候,乘以的v都是当前牛的v(当前最大)。 在纸上画个图就能看出
2012-08-11 22:47:50
443
原创 USACO 1.3.4 Prime Cryptarithm
暴力求解法,由于数据规模小,穷举即可,注意取位的技巧。 代码如下: /* ID: michael139 LANG: C PROG: crypt1 */ #include #include int vis[10]; int main () { FILE *fin = fopen("crypt1.in", "r"); FILE *fout = fopen("crypt1.
2012-02-22 18:08:56
410
原创 USACO 1.3.3 Calf Flac
题意:给定一个字符串(只考虑其中的'a'~'z'或'A'~'Z'),找出其中最长的回文,输出回文长度和原始的最短的包含该回文的字符串片段。 数据的输入比较恶心,为此WA了好多次。题意要求测试文件里可能有多行数据,每行不超过80个字符,总共不超过20000个字符。找回文的时候,要把多行数据看成一行,找最长的,但输出的时候原来有换行的地方在回文里还是要换行,需要注意。 代码如下: /*
2012-02-22 16:41:26
676
原创 USACO 1.3.2 Barn Repair
贪心算法。先用vis数组标记此栏里是否有牛(vis[i]==1表示第i栏有牛),然后用数组gap记录从此栏开始的最大空缺(比如X表示有牛,O表示没牛:XXOOOOXOX,编号从1开始。那么在这种情况下gap[2]==4,gap[7]==1,其他位置gap值均为0)。 贪心策略:统计牛一共被分成了连续的几段(设有K个位置gap不为0,则牛被分成了连续的K+1段)。然后比较能提供的最大木板数m与K+
2012-02-22 00:47:41
403
原创 USACO 1.3.1 Mixing Milk
本题利用贪心算法即可求解。贪心策略:优先取单价最低的,直到数量足够。 代码如下: /* ID: michael139 LANG: C PROG: milk */ #include #include typedef struct { int p,a; } Farmer; Farmer f[5050],temp; int main () { FILE *fin = f
2012-02-21 23:15:04
380
原创 USACO 1.2.5 Dual Palindromes
此题可以利用1.2.4中所写的进制转换函数,题目本身没有太大难度,模拟即可。 代码如下: /* ID: michael139 LANG: C PROG: dualpal */ #include #include int tenToB(int ten,char B[150],int b); int main () { FILE *fin = fopen("dualpal.in"
2012-02-21 22:40:41
352
原创 USACO 1.2.4 Palindromic Squares
本题的关键是进制转换,如何将10进制数转换为B进制(2 代码如下: /* ID: michael139 LANG: C PROG: palsquare */ #include #include int tenToB(int ten,char B[150],int b); int main () { FILE *fin = fopen("palsquare.in", "r");
2012-02-21 21:59:36
459
原创 USACO 1.2.3 Name That Number
思路:先把dict.txt中的名字都转化成数字,存储在数组中,便于查找。需要注意的是数字与字母的对应表里没有字母Q和Z,还有就是如果有多组满足题意,则都需要输出。 代码如下: /* ID: michael139 LANG: C PROG: namenum */ #include #include char table[8][4]={"ABC","DEF","GHI","JKL","MN
2012-02-21 21:52:08
460
原创 USACO 1.2.2 Transformations
本题可以看作是一道几何题,定义了几种基本操作:1.顺时针旋转90度、2.180度、3.270度、4.绕竖直对称轴翻转、5.组合变换(先进行4,再进行1~3中任意一种)、6.不做改变。 题目给定变换之前的图像和变换之后的图像,求让上述一种变换来实现(注意,仅仅是一种),如果有多种,输出编号最小的,如果无解,则输出“7”。 代码写出来还是比较长的,不过思路很清晰。 代码如下: /* I
2012-02-21 02:00:02
477
原创 USACO 1.2.1 Milking Cows
我写的方法比较笨,用了一个时间轴数组vis,若vis[i]==1,则说明第i~i+1秒之间有牛正在被喂奶,最后统计一下数组上连续1的最大长度和连续0的最大长度就可以。 代码如下: /* ID: michael139 LANG: C PROG: milk2 */ #include #include int vis[1000500]; int main () { FILE *fin
2012-02-20 22:00:17
402
原创 USACO 1.1.4 Broken Necklace
模拟题,遍历项链,选择断点,然后双向搜索,应该注意项链是循环的,为了避免重复搜索,用vis数组来标记搜索过的珠子。每次记录最大可以收集的珠子数,与最大值做比较。本题要注意断点为w时的处理方法,特殊地,当珠子全为w时,输出n(即项链长度)。 代码如下: /* ID: michael139 LANG: C PROG: beads */ #include #include int main
2012-02-20 20:21:35
539
1
原创 USACO 1.1.3 Friday the Thirteenth
比较简单,直接模拟,需要注意闰年的判断和对不同月份日期的处理。 代码如下: /* ID: michael139 LANG: C PROG: friday */ #include #include int is_leapYear(int y); int main () { FILE *fin = fopen ("friday.in", "r"); FILE *fout
2012-02-20 19:17:55
361
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人