写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

文章目录

  • 简介
  • 由数据范围反推算法复杂度以及算法内容
  • 熟悉常见的 2 的多少次方
  • 头文件模板
  • 全局变量定义数据范围
  • 全局变量开数组
  • 0x3f3f3f3f
  • 熟悉各种变量的数据范围
  • 蓝桥杯一定要写return 0;
  • 数组开多大?
  • 关于输入输出的速度
  • 如何处理 Segment fault 错误
    • Segment fault 错误出现的原因
      • 内存访问越界
      • 非法指针
      • 堆栈溢出
    • 解决方法
  • 打表找规律
  • 循环 n 次与循环 n - 1 次
  • puts()
  • 如何让 Dev C++ 支持 C++11
  • 关于判断一个数是否小于等于其算数平方根

简介

 本篇博客来总结一下博主所了解的有关算法竞赛的一些小技巧,如果有不足或者需要补充的地方欢迎大家评论留言,我会随时补充更新。

由数据范围反推算法复杂度以及算法内容

一定要认真看题目的数据范围!一定要认真看题目的数据范围!一定要认真看题目的数据范围! 因为有时候题目可能是以前你做过的题目,但是数据范围不一样了,那么可能就是另外一种做法了! 。而且题目的数据范围还可以告诉我们很多信息,根据题目的数据范围甚至可以提前大概判断出用什么算法可以解决该问题,有该算法解决该问题是否合理,是否会TLE

 详见博客:如何由数据范围反推算法复杂度以及算法内容

熟悉常见的 2 的多少次方

  • 21 ~ 210 分别是:2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
  • 215 = 32768
  • 216 = 65536
  • 220 = 1 048 576(大概是106
  • 263 = 9.2233720368548e+18(大概是1018

头文件模板

 比赛之前可以先开几个文件来写每一个题目,先打好一个框架,然后多复制几份,可以节省时间。如果程序还需要其他的头文件比赛的时候直接添加即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>using namespace std;int main(){return 0;
}

全局变量定义数据范围

 一般使用 const 定义一个全局变量定义数据范围。比如数据范围为 n = 1000000,那么就可以定义为:

#include <iostream>using namespace std;const int N = 1000010;int main(){return 0;
}

全局变量开数组

 C++ 全局变量存储在 堆空间 中,局部变量存储在 栈空间 中,将较大的数组开成全局变量不容易爆栈,而且自动将变量全部初始化,如果是数字那么全部初始化为 0bool 数组全部初始化为 false。而且定义为全局变量如果参数要使用的话就不用再传参了,直接在函数中使用即可。

#include <iostream>using namespace std;const int N = 1000010;int q[N][N]; // 全部自动初始化为 0
bool st[N];  // 全部自动初始化为 false int main(){return 0;
}

0x3f3f3f3f

 这是一个很神奇的数字。当需要把一个数组中的数值初始化成 正无穷 时,为了避免加法算数上溢或者繁琐的判断,可以使用#include<cstring>头文件中的 memset() 函数 memset(a, 0x3f, sizeof a) 给数组赋值成 0x3f3f3f3f 的值来代替。这个数转换成十进制为:1061109567 它的两倍为:2122219134。而 int 的最大值为:2147483647。所以在很多题目中用它表示正无穷可以更加方便我们写程序。

熟悉各种变量的数据范围

 具体的数据范围请看:C/C++ 各种变量的数据范围

蓝桥杯一定要写return 0;

 如果参加蓝桥杯不写 return 0; 的话即使程序写对了,运行结果也没错,也会不得分。所以在平时练题的时候要养成好习惯。

数组开多大?

 一般为了防止越界,会将数组大小多开 10 个。比如数据范围为 1 <= n <= 10000 那么最好将数组大小开到 10010

关于输入输出的速度

 当题目的数据范围为 N > 1 0 5 10^5 105 时,在解题时最好使用 scanf() 输入,用 printf() 输出,如果用 cin 和 cout 所需的时间会更多,可能会超时。所以当输入数据的规模超过 1 0 5 10^5 105 时 最好使用 scanf() 输入,用 printf() 输出。规模小于 1 0 5 10^5 105 两者消耗的时间差不多,都可以使用。

如何处理 Segment fault 错误

Segment fault 错误出现的原因

 引起 Segment fault 错误的原因有很多种,一般在做算法题目的时候引起该错误的原因主要如下:

内存访问越界

  1. 访问数组时使用错误的下标,导致数组访问越界。
  2. 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。

非法指针

  1. 使用空指针
  2. 新申请指针忘记赋 NULL,也忘记分配空间,直接使用造成非法访问。

堆栈溢出

 数组开的非常大,导致堆栈溢出。

解决方法

 当做题遇到 Segment fault 错误时是不好调代码的,因为通常编译器只会报这个错误,但是不会报出现错误的具体地址。这时候可以使用 exit(0) 函数(正常退出程序)来定位错误出现的地方。具体操作方法为:结合 二分方法,每次将 exit(0) 放在整个代码段的中间,如果程序正常结束,说明错误在后半段,否则说明错误出现在前半段,这样依次二分下去很快就可以定位到出错的地方。

打表找规律

 如果有些数学题目没有任何想法,可以先试试打表找找规律,可能会找到解决题目的公式,或者某些规律。

循环 n 次与循环 n - 1 次

 在写 while 循环时,如果需要循环 n 次可以这样写:while(n--)。当需要循环 n - 1 次时则可以写成:while(--n)

puts()

 需要输出回车换行时,可以直接使用 puts(""); 语句。需要包含 #include<cstdio> 头文件。

如何让 Dev C++ 支持 C++11

 如果 Dev C++ 不设置的话可能没法使用 C++ 11。手动设置的方法为依次点击:Tools -> compiler Options 然后在 compiler Options 界面勾选 Add the following commands when calling the compiler ,在其下面的框中添加 -std=c++11 命令,最后点击 OK 即可。

关于判断一个数是否小于等于其算数平方根

 有时候我们需要判断一个数是否小于等于其算数平方根,比如使用试除法判断一个数是否是素数的时候:

bool isPrime(int n) {if (n < 2) return false;for (int i = 2; i <= n / i; i++) {if (n % i == 0) return false;}return true;
}

 这里为什么要用 i <= n / i 来判断 i 是否小于 n 的平方根呢?原因主要有两个。很多时候我们会想到求平方根的函数 sqrt(n),但是这个函数的效率是比较慢的,不推荐使用。那用 i * i <= n 可不可以呢?也是不推荐的,因为这个操作有数据溢出的风险。当 n 比价接近 int 的最大值(2147483647)时,当 i 比较小的时候可以满足 i 2 {i^2} i2 <= n ,但是当 i + 1 的时候就数据溢出了。所以在判断一个数是否小于等于其算数平方根的时候最好是用 i <= n / i 来判断。


未完待续,持续更新中……

算法竞赛的一些小技巧相关推荐

  1. ACM 算法竞赛入门级模板 ------ (比赛技巧工具)

    1.文本输入.输出 void fre(){freopen("C:\\Users\\acm\\Desktop\\输入文本.txt", "r", stdin);fr ...

  2. java算法竞赛:快速读入输出

    我们在使用java写算法题时,常常会因为超时而苦恼,明明是和C++一样的思路,甚至代码实现都极为相似,但是却比它慢上一大截,这时候不妨试试IO流读入输出数据,提升速度. 参考文章 Java写算法题中那 ...

  3. 做算法题时的一些小技巧

    做算法题时的一些小技巧 技巧一: 在用C++做算法题时,我们会觉的cin,cout比scanf,printf使用起来更加的方便,不用指定输入输出格式. 但是cin,cout的运行时间比scanf,pr ...

  4. c语言二分法查找一个数_算法竞赛小专题系列(1):二分法、三分法

    本系列是这本算法教材的扩展资料:<算法竞赛入门到进阶>. 罗勇军.郭卫斌. 清华大学出版社 二分法和三分法是算法竞赛中常见的算法思路,本文介绍了它们的理论背景.模板代码.典型题目. 1. ...

  5. MATLAB小技巧(2)Delaunay三角剖分算法

    MATLAB小技巧(2)Delaunay三角剖分算法 前言 一. MATLAB仿真一 二. MATLAB仿真二 三. MATLAB仿真三 四. 小结 前言 MATLAB进行图像处理相关的学习是非常友好 ...

  6. 奇技淫巧-STL 库 ACM算法小技巧(持续更新中~~~)

    STL 库中的奇技淫巧 STL 是惠普实验室开发的一系列软件的统称,可以理解为一些容器的集合.STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件.STL 现在是C++的一部分,因此不用额 ...

  7. 15年经验分享:40个改变编程技能的小技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法那些事 编程如何节省更多的时间,犯更少的错误 ...

  8. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  9. 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

最新文章

  1. 揪出MySQL延迟上千秒的元凶
  2. mysql max 多个字段_mysql – 选择max()多列
  3. Docker 创建镜像
  4. python使用spark sql查询impala_如何使用JDBC将Impala表直接加载到Spark?
  5. 软件工程——结对编程第二次作业
  6. [转载] c语言中检查命令行参数_C中的命令行参数
  7. 物联网 云计算 大数据 分布式
  8. 关于ODOO中高级视图的看板案例错误
  9. 条码打印软件如何批量打印快递单
  10. 吴恩达NLP课程资料
  11. Postgresql - 监控 moniter — pgbadger
  12. linux /home recovering journal,启动Ubuntu时出现 /dev/sda2 clean 和 /dev/sda2 recovering journal 现象的解决办法...
  13. python plot画柱状图_matplotlib使用:画柱状图
  14. arcengine双击属性表内的一行,定位到该要素,并添加到选择集
  15. 求解N的N次方的个位数
  16. 5G步入规模化商用关键期
  17. Arnold材质节点篇-摄像机
  18. 目标检测:二维码检测方案
  19. Studing Day3 - python基础3
  20. 多分类模型Accuracy, Precision, Recall和F1-score的超级无敌深入探讨

热门文章

  1. findbugs 接口文档_Findbugs安装使用文档
  2. 微软ADFS成本评估
  3. 九日打卡-2-阅读报告
  4. Java 中的编译器分为哪些类型?
  5. Mikrotik RouterOS脚本定时发送ip至邮箱
  6. 网络流行伤感日志:如果有一天,我从你的世界消失了
  7. 男朋友想自学python_我在学习鼓励男朋友初篇-百度经验
  8. ORA-01950:表空间USERS中无权限的2种方法
  9. java中xsl用法_XSL-FO 简单使用方法(java xsl-fo xml)
  10. 时钟同步技术解析:原子钟实现 Ture-time 机制