C++基础知识:挂分小技巧

本文详细列举了C++编程竞赛中容易导致扣分的各种小技巧,包括数组、结构体、字符串、数学、数据结构、算法等多个方面的错误示例,并提供了正确的处理方式,帮助参赛者提高代码质量。
摘要由CSDN通过智能技术生成

写在前面#

下面的内容中每一个挂分小技巧:
第一行是指出了错误,第二行及以后说出了正确做法(可能没有),
如有不是的会特别指出,请注意。

常见的挂分小技巧#

  • max(a,b)max(a,b) 或者 min(a,b)min(a,b) 写成 (a,b)(a,b),这样会取后面的数,即 bb。
  • 在结构体里开数组开的太大。
    这种情况下即使没爆空间也会出现许多奇怪的错误。
  • 数组的下标减出负数导致 RERE。
    请一定注意这个地方,一定要加一个判断,数组下标一般不能是负数!(除非你来这里
  • 使用了结构体,导致内存不连续访问被卡常。
  • 数组嵌套过多被卡常。
  • 输出 ull 但不知道 printf 对应的占位符,宁肯瞎猜也不用 cout。
    这种情况请使用 cout。
  • 比较两堆数的乘积大小直接乘了起来导致爆掉
    应取 log 函数进行比较。(清北国庆刷题营Day3T1、洛谷P4370组合数问题)
  • 设置最大值时比给出数据的最大值还要小。
    设置最大值时注意数据范围。
  • 复制粘贴代码后没有修改充分导致出现错误。
    这种错误的解决方法就是:认识检查或者直接重写而不是复制粘贴。
  • 做完题之后不检查。
    我就是生动的例子,只过样例不可靠,样例一般都是精心设计好的,一定要自己多造几组数据。
    检查很有用,但是也不保证检查一定会查出错,不保证不会改错。
  • 在使用 sqrt()sqrt() 函数 或 pow()pow() 函数 时没有进行类型转换。
    注意 sqrt()sqrt() 函数的返回值 和 pow()pow() 函数的返回值为浮点数。
  • 滚动数组忘记清空。
    滚动数组不清空,爆零两行泪。在 DP 中经常会用到滚动数组来降低空间复杂度,为了避免意外的错误发生,请记得清空已经用过的滚动数组。
  • 全局变量和快读的局部变量相同都会读入一些奇奇怪怪的东西。
    这个我好想没遇见过……不过学弟都说了就放上来吧。
  • printf 里面 %llu 写成 %ull。
  • 读入字符用 scanf。
    用 scanf 中的 %c 来读多个用空格隔开的字符时,它会去读空格。这个时候我们可以这么写:
    char s;
    //在 %c 前加一个空格
    scanf(" %c", &s);
    
  • 随时计算 for 循环的上界。
    for循环的上界不要随时计算, 复杂度可能爆炸, 类似于 i<=sqrt(q),i<=strlen(s)
  • 位运算不注意优先级导致运算出错。
    位运算的运算优先级很低,所以在不了解优先级的前提下,建议位运算加括号。
  • 特别指出,此处为正确做法)注意实数二分的精度问题, 实数输出的精度问题。
  • 特别指出,此处为正确做法)在struct 中, 写重载运算符时注意格式。
  • 特别指出,此处为正确做法)在操作时注意数组边界, 包括枚举时超出定义大小, 和枚举的部分应不应该有初值。

取模中的挂分小技巧#

  • 模数取错。
  • 不随时取模。
    注意取模,看好两个数相乘的结果是否会爆出你所定义的类型。
    当然也不是取模越多越好,因为取模本身比较慢,所以应该在合适的地方取模。
  • 特别指出,此处为正确做法)在取模时注意负数的取模。
  • <
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值