刘汝佳《算法竞赛入门经典》---总结

本文是对刘汝佳《算法竞赛入门经典》中关于并查集部分的总结,重点介绍了如何初始化并查集及其在处理村庄编号从1到n情况的应用。
摘要由CSDN通过智能技术生成
刘汝佳:《算法竞赛入门经典》

三步:
基本的数据结构+算法知识;
数论等数学基本知识;
锻炼联想建模能力、知识与实际相结合,解决实际问题!

第一章:程序设计入门
1.a/b  当a、b为整数时,结果向中间位置靠拢;例如: -8/5 结果为 -12.浮点数使用%.3lf 输出; 另外: 整数-浮点数=浮点数    整数/浮点数=浮点数;
3.在竞赛中尽量使用const int 的形式来定义常量( 定义同时初始化); 在eclipse中定义目前最大为10位;
    #define 好像最大也是10位的样子;


第二章:循环结构程序设计
1.找不出错误的时候,也可以使用输出中间结果的方法 ,来进行差错;
2.学会使用伪代码来初步编写程序!  可以适当使用汉字等, 之后将汉字部分改写成函数,进行调用即可。
例如:
    for(a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            if(aabb是完全平方数) printf("%d",aabb);  之后将if()括号中内容,改写成函数调用。
    这个有一点迭代式开发的意思,即每次只添加程序中的一小部分内容,保证正确性。
3.开平方可能会出现浮点误差,  有时可能会使用枚举平方根的操作,来避免开平方操作;
4.一个运算表达式的取余运算, 可以将取余操作设置到每一步计算的后面,结果不变;
5.scanf()返回值为成功输入的变量个数;


第三章:数组和字符串
1.memset(f,0,siziof(f)); 将数组f初始化为0;
2.最长回文子串:
    这里解决了3个问题:首先是输入字符串中含空格,这里使用了fgets()函数;其次预处理得到不含标点且全为
大写的字符串;最后是:当判断当前子串为最大回文子串时,其在原来字符串中的位置不确定,这里新开一个数组
保存其原先的位置下坐标!
    char f[N];   
    fgets(f,sizeof(f),stdin);
判断方法的改进:
    枚举回文串的中间位置!然后不断向外扩展。
3.printf("%d %o %x\n",a,b,c); // 分别对应输出十进制,八进制,十六进制;
4.strchr 函数的功能:在一个字符串中查找一个字符。--------------(这个的应用在字符串题目中应该比较广泛了)
5.如果按照自己的方式处理字符串的时候,一定要保证字符串以 '\0' 结尾!


第四章:函数和递归
1.函数调用过程中,碰到return语句时,会直接退出该函数;
2.在编写函数的时候,应尽量避免函数缺陷;如若不然,应在显著位置上标明函数的缺陷,以免误用。
3.在编写程序时,尽量少使用全局变量,比较危险。
4.设计递归函数的重点:在于给下级安排工作!

-----------------------------------算法篇-----------------------------------

第五章:基础题目选解
1.使用常量简化代码。  一般来说是常量字符串,先保存起来一些需要用到的东西。
2.typedef 定义结构体。
    高精度运算。(75页)
3.qsort 给整数和字符串排序。
4.预处理的强大作用:
    例题:字母重排问题。(78页)
        提前的预处理,将每个单词直接重排字母顺序之后再保存下来会为后面省略很多麻烦。
5.因子和阶乘
6.三角形有向面积计算及其应用:
    判断一个点是否在一个三角形ABC内:
    计算Sabc == Soab + Sobc + Soca ? 是否成立。 这里的面积为有向面积。
计算方式为:(85页)
        |X0 Y0 1|
    2S=    |X1 Y1 1|
        |X2 Y2 1|   行列式的计算方式。三点为逆时针排列,结果为正。否则为负。
7.一个平面上,计算结果与 顶点、边、面的个数有关时,可能会用到欧拉公式:  V-E+F=2  分别对应:顶点、边、面。


//-------------   88页有一些推荐题目,等回头挨着做了。


第六章:数据结构基础
1.关于排队队列的问题,一般可以设置两个标志变量。   front与rear,分别指向头和尾。 然后使用while(front<rear)进行判空。
2.使用栈时,一般从下标1开始进行计数;   需要一个数组和一个栈顶指针。
3.当移动次数较多时,一般使用链式结构。
4.二叉树的结构:小球从顶部从上至下滑落,除了直接模拟求小球最终落点之外,还可以按照小球的奇偶行来进行判断。
5.图:网状关系,递归求解的比较多。  包括深搜dfs、广搜bfs。
    另外,如果图过大,递归dfs或者bfs容易造成栈溢出的危险,应想其它方法解决。
6.求解迷宫及其路径:宽度优先便利较为适用!  每次路径长度都是固定+1,其父节点即为当前刚从队列中出来的节点。
7.dfs/bfs  都需要做的一点就是,都需要避免节点的重复访问。


第七章:暴力求解法:枚举、基于枚举的回溯、深搜、广搜、剪枝操作等。
1.枚举排列:
(1)生成1-n的排列:
递归实现:
    函数参数:数组的元素个数、当前已经确定的数组A,当前需要填写的位置cur。
    选择下一个要填写的元素时:是按照从小到大枚举,查找第一个不在A中的元素。  尤其注意cur一定要设为局部变量!不然需要还原数据。
(2)生成可重集的排列:
    之前是设置一个标志变量ok,现在改为设置两个c1、c2,当c1<c2即可继续递归调用;
另外,为了防止重复,在枚举for循环下,加上一个判断, if(!i || p[i]!=p[i-1]) ,即可防止重复!
(3)下一个排列:
    这里是调用的一个C++的库函数来实现的!  
    先得到当前序列,之后调用 next_permutation(p,p+n);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值