【算法技巧】算法竞赛中的小技巧

  • 开辟的数组空间稍大于理论值 -> 更加保险
  • 声明数组大小(以理论范围为 100000 为例)
const int N = 1e5 + 10;
  • 取中间位置时,取中间位置用如下写法 -> 避免造成整数结果溢出
 l + ( r - l ) / 2
  • 浮点数精度最好比要求的多两位 -> 更加保险
r - l > 1e-8  // 要求:结果保留 6 位小数。
  • 工程中空间能省一点儿是一点儿,算法中重要的是效率和通过率
  • 工程中药考虑内存,算法中不要考虑内存泄漏的问题,否则会绕进去,能 ac 就行
  • 使用如下方法,让 cin,cout 的效率和 scanf,printf 差不多
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
  1. 这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。
    cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几.
  2. tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。
    在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
  3. 注意点:使用之后,不能够混用 cout 和 printf,cin 和 scanf。
  • ACM中常用的无穷大常量——0x3f3f3f3f
const int inf = 0x3f3f3f3f;

0x3f3f3f3f的十进制是1061109567,是10 ^ 9级别的,而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。

0x3f3f3f3f是一个很有用的数值,它是满足以下两个条件的最大整数。
1、整数的两倍不超过 0x7f7f7f7f,即int能表示的最大正整数。
2、整数的每8位(每个字节)都是相同的。

我们在程序设计中经常需要使用 memset(a, val, sizeof a) 初始化一个数组a,该语句把数值 val(0x00~0xFF)填充到数组a 的每个字节上,所以用memset只能赋值出“每8位都相同”的 int。
当需要把一个数组中的数值初始化成正无穷时,为了避免加法算术上溢出或者繁琐的判断,我们经常用 memset(a, 0x3f, sizeof(a)) 给数组赋 0x3f3f3f3f的值来代替。

  • memset 是以字节为单位复制的,不能用于普通数组的初始化,一般用于char 或者 0 和 -1 的初始化。
memset(h, -1, sizeof h);  // memset 按字节复制 -1 为 0XFF,复制后为0xFFFFFFFF也为-1
memset(h, 0, sizeof h);
  • 输入特别多,如果超过1e6 之后才必须用 scanf,否则和 cin 效率差不多。
  • 为什么当输入数量级是 1e5 时至少要用 O(nlog(n)),如何评估会不会超时。

为什么代码会超时?

  • 整数除法向上取整方式及证明:

result = (m + k-1) / k;

在这里插入图片描述

  • 解决 LeetCode 中加速 cin、cout 的方法,使用静态 lambda 函数;
static int _ = [](){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return 0;
}();

  • 可以接受的算法时间复杂度估算表
    在这里插入图片描述
  • 本地读测试用例的宏,避免手动输入测试用例
#ifndef ONLINE_JUDGE
    freopen("in1.txt", "r", stdin);
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值