落絮飞雁

顺流而下,把梦做完

唏嘘

晚上整理了一下网站。改了改分类目录,顺便看了看之前写的几篇文章,把其中的一些碎碎念设置下权限。结果发现最近写的全部都是些小白“技术帖”。难怪最近流量大减。回过头来,我发现那个感觉“没学到什么东西”的暑假里,技术帖更是已几乎一天一篇的速度更新着。看到刚到萧山时候写的一句话:“一切不能杀死你的都能让你更强大”,果真如此。 READ MORE →

循环显示的名言 Ver141016

又添加了几条名言,依旧在网站的左上角循环显示。因为启用了缓存,所以并不是每次刷新都能够更新名言。

READ MORE →

ACM刷题站精选

转自知乎——Luau Lawrence回答

此题回答与【国内有哪些好的刷题网站?】相同,为了方便阅读,都给出详细作答。

Welcome To PKU JudgeOnline 北京大学的Online Judge。POJ上面的题目有点老了,但好处是做的人多,经典算法题多,解题报告也多,适合上手。

ZOJ :: Home 浙江大学的Online Judge。ZOJ用的不多,但为数不多的几次体验好像都还可以,值得尝试。

Welcome to Hangzhou Dianzi University Online Judge 杭州电子科技大学的OJ。杭电OJ在近几年取代了POJ,成为是目前国内最主流的OJ。它的题目丰富,难度梯度合理,广受全国各大高校的青睐。每年也会有大大小小的比赛挂在杭电的OJ上举办,去年的亚洲区网络赛也是在这上面做的。由此可见其在国内广大ACMer心目中的地位。也正因为如此,网上hdu的解题报告也很多,适合个人进阶训练。

UVa Online Judge 西班牙Valladolid大学的Online Judge。是最古老也是全世界最知名的Online Judge,题库有详细的分类:如世界总决赛题目,刘汝佳的题目等等。题目目类型非常广泛。绝大部分的题目难度偏易,适合初学者磨练程序设计。

Timus Online Judge URAL是一个俄罗斯的在线题库。里面的题目相比国内一些OJ来说颇有些难度,我们学校集训队老队员喜欢拿这里的题出给新队员做,可见有一定的进阶作用。

Sphere Online Judge (SPOJ) SPOJ是波兰最为出色的Online Judge之一,界面和谐,题目类型也非常丰富,适合有一定基础的选手练习,对高手而言也是个提高能力的良好平台。传说君临天下的楼教主刷完了这个OJ?(更正:楼教主刷完的是SGU,感谢 @康Connor 指正)更多介绍见博客:SPOJ简介 – 海山

Saratov State University :: Online Contester 之前上SGU一直是404,所以不敢贴上来。现在亲测能上了就也放上来给大家看看吧。这个是货真价实的楼教主刷完的OJ。楼教主为什么要刷这个OJ而不刷这个回答里的其他OJ呢?因为这个OJ确实适合提升水平,应该跟Ural, SPOJ的难度相当。另外就不太了解了,在我心目中,SGU, Ural, SPOJ都适合区域赛冲金以及毕业想去Google等顶级公司的ACMer/Coder训练,三者区别不大。

Codeforces Codefores是俄罗斯的一个算法竞赛网站,由 Saratov State University 创办和维护。Codeforces主要强调的是算法竞赛,每隔1个礼拜左右就会有定期的线上比赛举行,其题库也是由每场比赛的题目一场场积累下来的。相比上面几个以题库为核心的OJ,Codeforces的算法竞赛比较适合锻炼自己的临场发挥和压力下编程能力。

HUSTOJ 华中科技大学的Online Judge。hustOJ也和主流的其他OJ一样有着丰富的题库。但它主要的用处,是它所提供的这么一个叫做vjudge的东西,全称叫做Virtual Judge。通过vjudge,你可以从各大OJ、包括但不限于上述的所有OJ中直接抽取题目,利用这些题目创建一个属于你自己的比赛。非常适合专题训练、日常集训以及小伙伴们一起比赛切题玩。

LeetCode Online Judge 与很多OJ不同,leetcode是一个主要面向面试者的OJ (LeetCode OJ is a platform for preparing technical coding interviews)。上面的题目不多,目前只有152道,很多都是许多大公司的面试题目。题目类型偏基础,基本不会考察复杂的算法,很多都是对基础知识的应用,难度与topcoder div1 250或codeforces div1 A题难度相当。如果是希望练习编程基础或准备公司面试的话非常推荐此OJ(感谢室友/集训队大神/CMU准硕士 @yun peng 同学提供Leetcode介绍)

HDOJ2041

今天OJ 不能登录。可能是周末不上班吧。题目描述没复制下来。放上写的代码。

超级楼梯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30969    Accepted Submission(s): 15992

Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

 

Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

 

Output
对于每个测试实例,请输出不同走法的数量

 

Sample Input
2 2 3

 

Sample Output
1 2

 

 

#include
int main()
{
	int n,m,i;
	int num[40]={1,2};
	scanf("%d",&n);
	for(i=2;i<40;i++)
		{
			num[i]=num[i-2]+num[i-1];
		}
	while(n--)
	{
		scanf("%d",&m);
		printf("%dn",num[m-2]);
	}
	return 0;
}

我的日剧清单

计算机系学长的大学四年(转)

注:本文转自__Boost的CSDN博客,原文链接

1.极端的社会舆论

每每看到大学生就业报告里提到计算机系学生失业人数最多时,我就想mn,什么原因导致了这种现象的发生,在中国软件还处于比较初级的阶段时,市场对软件人才的需求应该每年在大幅的递增,可是大学里培养出来的计算机科班人才质量却每况愈下,甚至还不如一个软件培训机构两三个月训练出来的人好用,为什么?想想现在的计算机科班毕业生的水平吧,大学四年下来,90%的学生写的代码没有超过2000行,不Linux操作系统为何物,不知道C++和Vc的区别,没有开发出一块实用功能的简单软件,没有使用过STL,甚至不知STL为何物,更不用提设计模式之类的比较高级一点的东西了……这样的例子还能举出很多…

就是这样的人才质量,如何让一个以营利为目的的公司接受,如何为企业创造价值?但是也有那么一些人,能进入微软、IBM、google、百度这样的公司,拿着年薪几十万。

2.失败的计算机教育体制

我也是一名毕业不久的计算机科班毕业生,从我目前了解的情况看来,大学时,没有几个学生真正的对计算机编程感兴趣,体会不到通过编程解决问题带来的乐趣,只是单纯的跟着课程的设置学习,这样没有目的性的学习效率如何之底?大学里的学生又有几个人能对自己的职业规划有一个基本的了解?大学里有几个人能理解学习的课程在具体的实践中的作用?这些惨痛的例子说明了我们大学对计算机系学生的引导是非常不够的?没能激起对学习计算机技术的兴趣?不能告诉大家一个将来一个明确的职业规划方向,没有很好的引导学生去思考自己的职业规划方向?如果是这种状态去学习,大学四年基本是废掉了……

另外一个就是大学课程的设置,各种各样的课程,填鸭式的教学方式….纯粹理论式的教学方式….到头来,学生真正学到了什么?几个术语名词而已…..一样对操作系统是那样的迷茫….不知道编译原理的语法分析为何物?不知道数据结构中的树和图将有何用?

3.四年后,我能骄傲的说我是计算机系的学生

上面发了那么多的牢骚,其实都是有感而发….下面在结合自己的工作的感受具体谈谈计算机学生应该如何规划自己的大学四年

大一:

一个新兵蛋子,刚走进象牙塔的大门,什么都是新鲜的,不断听着学长们说着天书般的技术术语…天天争论C++和java哪个好,.net是否比Vc更智能先进…. 还有什么Asp.net …. 一堆的技术摆在自己面前了…

然后自己就糊涂了….去问学长吧…学长告诉你..好好学习java吧…将来有钱途…..

其实大一,没必要学习各种新鲜的技术…..把高等数学学好吧….这才是正事,是决定了着将来你是否能称为一个大牛还是一个编程语言的熟练操作工人的因素….也许这时候的你还不知道高等数学有什么作用…

但我要告诉你的是如果你的悟性高….工作一两年也许就能体会到数学的做用….学高数..不是简简单单的学习微积分….在掌握这些知识的时候….锻炼自己的逻辑思维….. 锻炼自己的思考问题解决问题的方法和能力。作用在将来一定大大的…..等将来如果你涉足密码学…你会发现各种积分方程和矩阵变化….将来在计算一个算法的复杂性和证明算法的可靠性时,也离不开数学知识….如果你涉足人工智能和语音识别,各种统计模型就会呈现在你面前。在你毕业找工作时,这个才是你和专业培训机构培训出来的学生的差异能力。这才是企业更看重的能力。如果你还有时间的话,学习C语言…但是不要再用谭浩强的书了…. 看

The C program langue吧… 如果能真正领悟书中70%的例子话,那就足够了. 如果能把这两门课程学到十分优秀,恭喜你,你已经成功了一半了…..

大二:

如果你在大一学习了C之后,这个时候大学的课程就要涉及操作系统和数据结构、还有汇编语言了……这也是大二一定要学好的两门课了……大学的操作系统太失败了,上完课后,很多的学生不知道所云,更加感觉操作系统的神秘了,课程设计也就是什么银行家算法的,然后大家在网上一顿搜索,然后交给老师就算完事了…

其实,我的建议是自己写一个操作系统内核,实现内存管理,进程管理和切换等一些基础的东西了就可以了,《自己动手写操作系统》就是很好的教材……如果还有时间,学习《Linux内核设计与实现》,看看现实商用的操作系统是怎么实现的?当然最好和原码结合的一起看,效果最好。还有赵炯博士的“.012Linux内核完全剖析”什么的。如果能仔细阅读,收获一定不少。当然还有数据结构,这个也是重中之中,这也是和非科班出身的学生的差别,关键是你学的好坏,这个的实践主要在ACM上,当学习完数据结构后,最重要的是使用,不断的在Acm上做各种各样的题目,不断的提升自己算法设计的能力。从大二开始,如果能坚持两年下来,那么一般的算法设计肯定是难不住的了,也许这时候高数打下的基础就会起作用了。

当毕业的时候,进入一家好的公司应该不是太难的事情了。再说说汇编语言,本质上这也是一门编程语言,可能刚入门的时候比较困难,但是程序写多了,和C也没有差别了。我还想说一点,就是现在Windows内核也逐步开放了,至少有很多的逆向的资源可以学习。如果对Windows有兴趣,一样可以学习操作系统的实现原理。

大三:

离散数学和编译原理是个重头戏,离散数学虽然我现在还没体会到他的作用,但是和高数一样,这中内在的东西才是最重要的,代表着内功,如果没有学好,这些债迟早还要要还的。编译原理,学习完以后一样会让你云里雾里,整天做那些无聊的题目。还是说实践吧,网上有开源的C编译器的源码,下载下来然后好好学习下,结合编译原理书中讲的东西,好好的消化一些这些知识,最后,自己如果能写出来一个C编译器的话,那你的编译原理也就通过了。当然这个时候可以学习一些C++或Java之类语言,但是学到够平时用的就可以了,没有学非常深。选择一本教材学习两三个月就行了。

当然,这个时候,可能你的同学已经能做出来各种漂亮的网页,也可能熟练的使用MFC类库做出各种各样的漂亮的软件,这些没什么,如果三年下来,如果你能够按照上面我写的那样坚持学习。也许他们用三年学习的这些东西,你用三个月就能熟练。

大四:

到了找工作的时候,如果你按照上面一步一个脚印的学习,我相信你会收到很多大公司的offer。因为大公司更看重的是你的内功的深厚,而小公司才会看重那些花拳绣腿的技术。但是这个时候,千万不要忘记继续学习,很多的学生大四一年都浪费掉了,真实太可惜了,在前面三年的基础上,到了厚积薄发的时候了,

开始要思考自己的职业规划了,你要选择Linux方向还是Windows方向,要选择底层方向还是应用方向,

要选择网页方向还是桌面应用方向。是选择自然语言处理还是人工智能。这个时候你要选择自己的一个方向,当然你可以向你的导师求助,然后确定自己的发展方向,大四一年就可以专心的学习了。

4.附上我认为计算机学习比较好辅助教材:

C语言: the C Program Language

操作系统; 于渊:《自己动手写操作系统》

《Linux内核设计与实现》

《Linux内核完全剖析》

《Linux内核情景分析》

《Windows内核情景分析》

编译原理:龙书《编译原理》

汇编:王爽老师《汇编第二版》

5.后记

以上都是自己在工作后对大学四年的反思,可能很多人有不一样的看法,我没有任何异议。毕竟每个人经历是不一样的,但是如果你向想做真正的计算机科班出身的学生,学好上面介绍的课程吧。在以后的职业生涯中,你会终身受益的。当然上面很多的课程我没有提到,并不代表他们不需要学习,只是分量没有那么重而已。因为你还是要毕业的,每门功课还是要过的。zds

当然,我现在认为,计算机的本科四年真是一个打基础的四年,之后才是学习各种招式,如果基础打好了,招式的学习会事半功倍的。当进入公司后,一样要持续不断的学习,才能让你不断的进步。自己文采不好,写的比较乱,但都是肺腑之言,各位将就看吧。

快速幂取余算法例题

问题描述:
求 B ^ P % M = ?

代码实现:

#include 
using namespace std;

int main()
{
    freopen("input.txt","r",stdin);
    int B,P,M;
    while (~scanf("%d%d%d",&B,&P,&M))
    {
        int ans = 1;
        B = B % M;
        while (P > 0)
        {
            if (P%2)
                ans = ans * B % M;
            P /= 2;
            B = (B*B) % M;
        }
        printf("%dn",ans);
    }
}

HDOJ2035:人见人爱A^B(快速幂取余)

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 23082 Accepted Submission(s): 16060
Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”

Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。

Sample Input
2 3
12 6
6789 10000
0 0

Sample Output
8
984
1

//快速幂取余,简单版本
#include
int main()
{
	int a, b;
	while (scanf("%d %d", &a, &b) && (a + b))
	{
		int i, s = a;
		for (i = 0; i

 

辗转相除法

两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12105 = 21 × 5);因为252 − 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 × 105 + (−2) × 252。这个重要的等式叫做贝祖等式

例题:

HDOJ1108:最小公倍数

最小公倍数

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 33998 Accepted Submission(s): 19029

Problem Description
给定两个正整数,计算这两个数的最小公倍数。

Input
输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.

Output
对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

Sample Input
10 14

Sample Output
70


求最小公倍数的问题,辗转相除法解决。
代码:

#include 
int main()
{
	int a,b,ai,bi,temp;
	while (scanf ("%d %d",&a,&b) != EOF)
	{
		ai = a;
		bi = b;
		while (bi != 0)
		{
			temp = bi;
			bi = ai % bi;
			ai = temp;
		}
		printf ("%dn",a*b/ai);
	}
	return 0;
}