想试试每天写写博客啥的
来源
就介绍一次吧 Competitive Programer's Handbook,Antti Laaksonen
从OI-Wiki上看到的,然后就开始看了。
书的下载链接会放在首页的书籍链接中,找不到ctrl+f找吧…
总体与简述
这本书总的分成三个部分,基本技术,图算法,高级主题。这本书作者假设读者已经有一定的编程能力了。根据作者所说,IOI所可能涉及的内容书中都有。感觉不错。
其中基础部分有10章,今天读了两章,先介绍一下
第一章 简介
第一节说明了一下这本书所有代码都是C++代码,然后给出了一般编程代码的框架(模版),其中重要的是#include <bits/stdc++.h>,这是g++的一个特性,可以将C++所有标准库都导入,而且基本上所有竞赛都支持。
第二节介绍了编程竞赛的典型输入输出,强调了空格多少在数字、字符串(不包含空格的)输入时并没有什么影响,然后给了个提高输入输出效率的tip,ios::sync_with_stdio(0);cin.tie(0);还有就是\n比endl的效率高一点,因为endl要进行flush操作。虽后给了对于读取行(getline(cin, s);)、读取未知数量的数据(while(cin >> x){CODE})、读取文件的代码(freopen(“input”, “r”, stdin);),其中读取文件主要采用的重定向,这样较为方便。
第三节介绍了数字,数字的类型在C++中是决定了数字的取值范围大小的,对于某些需要处理数字特别大的题,使用Python会友好一点。然后介绍了一下在C++中有哪些取值范围超大的,long long 64位,还有有些比赛不支持的__int128_t 128位。浮点数long double 80位,还强调了浮点数运算的精度损失问题,以及由此引来的相等问题,需要通过引入一个误差范围来解决。中间还夹着介绍了一下取模运算的重要性,可以将我们运算的值的范围始终限制在一定范围内,当中有几个特别棒的公式,可以让我们理解模运算为什么这么棒,这里就不列出来了,基本思想就是对运算结果取模,相当于对运算的各个单位取模再进行运算一样,对乘法加法减法都成立,除法稍微有点区别,可以自行查阅一下模运算。
第四节主要是介绍如何精简我们的代码,主要是通过类型定义,宏定义,不过需要注意宏定义有时候会引起一些奇怪的错误,所以宏定义时需要仔细斟酌。
第五节主要介绍了一些必备的数学,同时强调了数学对于编程竞赛的重要性,作者仔细介绍的数学主要包括级数求和、集合论、逻辑运算、函数(取整、最大值、最小值、斐波那契数列以及一个取近似值的tip)、对数(一个小tip是对数可以用来计算不同基数的数的位数)。
第六节最后一节介绍了IOI、ICPC,然后就是关于竞赛的一些常识。
第二章 时间复杂度
好像没有说空间复杂度?
第一节说明了时间复杂度的基本计算规则,包括循环、分阶段、抓最主要、多变量、递归这些思想或者计算方法,这个还是得自己看…
第二节介绍了复杂度分类,并且说明了每种复杂度的可能的代码情况,非常Nice,这里也不多说,有点多,回头有空加上。
第三节介绍如何估计效率,主要是通过程序给出的问题规模大小来估算我们至少应该达到的时间复杂度。
第四节是一个小实践,问题是寻找一个数列的最大子数列和,这个数列的值可正可负,且允许子数列为空。作者从最直接的暴力法O(n^3)说起,先是对其进行略微的改良达到O(n^2),然后介绍了一种O(n)复杂度的算法。最后比较了这三种算法在问题规模不同时的执行效率。其中O(n)复杂度的算法可能较为难理解一些,基本思想…还是不剧透了。
预告
接下来的两章分别是排序和数据结构,作者又会抛出怎样有用的知识呢。