OVa Online Judge 学习笔记

一、总学习原则:

  1.使用有道词典记录单词,并提高英语阅读能力,增加词汇量。

  2.《算法竞赛入门经典》指导下,先按照学习内容做题,再自由选题。

  3.做好做题的笔记,记录技巧,错误原因,及新知识点总结。

  4.实现优先使用C语言,设计高级算法时考虑使用C++。辅助书籍:C语言相关几个书、《算法导论》

二、AOAPC I 题目及笔记:

Volume 0:


494:

知识点:

使用ctype.h文件进行字符分类和字符转换。

C语言下单行处理:(gets在gcc下编译会弹出warning,而fget能够防止缓存区溢出)

char line[1024];

while(gets(line)) ...

技巧:深刻理解题目的对一些术语的定义,按照定义写算法。

414:

细节:gets遇到第一个换行符就结束,因此如果读取时缓冲区第一个字符就是换行符的话将什么都读不到,注意缓冲区可能留有上一行的换行符或输入中遇到只有一个换行符的行。

总结:

主要考察scanf\printf\gets\getchar(<string.h>)使用,这部分相当基础。

技巧:输出时若想检测空白字符是否输出正确(特别时空格),在调式时可以暂时使用别的可视字符替代。

二、《算法竞赛入门经典》(2)

例子:

1.10082 - WERTYU

知识点:getchar/putchar使用。

技巧:可以使用常量字符串(数组)简化算法(避免switch等条件选择语句或复杂转换)(思想:利用数组下标快速实现转换:数字->字符)。

(拓展:想到了字符集可移植性(《C陷阱与缺陷》):使用<ctype.h>文件中大小写转换和字符类型判定和 char* s = "0123456789" 替代a - '0')

2.272 - TEX Quotes

技巧:纯奇偶数判断可以采用标志变量1和0做辅助,不断取反(!),有利于简化代码。

  多个字符不采用putchar而使用printf(“%s"),有利于简化代码。

3.1584 - Circular Sequence

技巧:

gets(line)截止条件时换行符,保留其他空白字符;scanf("%s",line)截止条件是空白字符,忽略开头非空白字符(空白字符包含空格、tab键、回车键)。使用时注意上面两者区别。若一行不包含空白字符,可以用scanf替代gets去读取一行的数据。

知识点:

最小周期串:方法:枚举法求最小周期(周期最小为1,周期最大值为整串长度。)。速度优化:只考虑能整除整串长度的数做为周期,可大大减少运算量。

字符串最小表示:

1.暴力求解法,设字符串长度为n,枚举n个循环同构字符串,找出最小值。最差时间复杂度O(n^2)。

2.最小表示法:时间复杂度O(n):两端指针扫描

http://blog.csdn.net/cclsoft/article/details/5467743

http://blog.csdn.net/cclsoft/article/details/5467743

拓展:匹配循环同构字符串:若枚举匹配需要求模;可以赋值s = s1 + s1,再用s1与s子字符串匹配。

技巧:ACM题不能使用// 注释,会报错。使用C:/**/

4.401 - Palindromes

知识点:回文串和镜像串。

技巧:尽量使用scanf读取行,注意输出要求,像换行有的题要求每段数据结尾,有的题要求两个数据之间。

拓展:最长回文串问题。

5.1583 - Digit Generator

知识点:求整数位数及每位的数。关系到每位和时可以通过最大和=位数*9缩小搜索范围。

其他:第一次提交时错误,后面发现对输入为个位数的情况,考虑不够严谨,属于逻辑错误。

6.340 - Master-Mind Hints

知识点:建立标记数组缓存各个数状态。

算法优化:原来算法时间复杂度O(n^2),考虑的数据是1-9,采用位图数据结构统计并求值,时间复杂度减少到O(n)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章