算法竞赛:一些c++的奇技淫巧

2023-12-28 20:40
文章标签 算法 c++ 竞赛 奇技淫巧

本文主要是介绍算法竞赛:一些c++的奇技淫巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 算法竞赛:一些c++的奇技淫巧
    • 一、缩短代码、减少编程时间
    • 二、尽量使用模块化编程
    • 三、~~殿试~~ 认证 时
      • 心态
      • 考前准备
    • 四、一些编译优化
    • 五、养成代码习惯

算法竞赛:一些c++的奇技淫巧

本文旨在不涉及算法的情况下,尽量帮助选手表现的更好

如对本文有任何疑问,可以私信

一、缩短代码、减少编程时间

对于相似的代码,可以思考如何用函数,#define宏定义 等方式 减少代码长度

既可以增加可读性,减少错误。
同时也能缩短编程时间、方便检查

很多人认为 #define 会增加出现错误的可能。
因为预处理阶段会暴力替换被 #define 的内容,容易出现 优先级 等问题。

这个 “暴力” 对宏定义简直再合适不过了。我最开始看到也觉得作者很幽默。
直到——偶然看见关于宏定义的一篇文章。

比如下面这段代码:

#include <cstdio>int main() {
#define m 5+5printf("%d", m * 10);
}

输出的就是 55 而不是期望的 100

而改一下,加上括号:

所以 #define 通常会加括号避免优先级的问题。

此外,宏定义还可用于类似函数的作用,这里就不赘述了。

这是一方面,另一方面宏定义确实可以简化代码。

二、尽量使用模块化编程

例如把问题拆解成几个部分,分成函数分段解决

方便调试、查错

三、殿试 认证 时

弄死隋炀帝 感谢隋炀帝完善科举制度,让今天的我得以一天一小考,一周一大考。遗臭万年 流芳百世

殿试时,看到 皇帝 考官不要紧张,努力成为社交恐怖分子。

啊呸,说正经的。

心态

心态肯定是最重要的,保持良好心态,坦然面对💀

考前准备

头天晚上(好是一周以内,一直更好)不要吃奇奇怪怪的东西,比如穿山甲
易燃易爆枪支管制刀具等危害公共安全的东西更是随便带,看谁敢拦你😇
第二天便秘窜稀不要怪我没提醒,一堆警察冲进来更是相当搞同场选手的心态😇

四、一些编译优化

最常见的有#pragma GCC optimize(3)(打开O3优化)等。

  • 不过竞赛中慎用,可能会报CE,本地测不出来,到评测机上就挂了

而且对c/c++语言一般都会开O2

  • 平时可以用来卡常 不过也极可能报CE,看网站和要求

    目前我登录的网站,像洛谷、Atcoder等都不支持O2系列的优化(即针对编译期的优化)

    这里的编译期就是编译期,不是编译器。不是打错了

    具体可以参考 这篇博客->详解C/C++代码的预处理、编译、汇编、链接全过程 - 知乎 (zhihu.com)

    我觉得写得很清楚。


——如果非要不可

#pragma GCC optimize(3)
#pragma GCC target("avx","f16c","sse3","sse2","sse1")
#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3")
#pragma GCC optimize("Ofast","-fgcse","-fgcse-lm","-fipa-sra")
#pragma GCC optimize("-ffast-math","-fpeephole2","-fsched-spec")
#pragma GCC optimize("unroll-loops","-falign-jumps","-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("unroll-loops","no-stack-protector")

绝对炸裂。放进你的代码里,生成 传 说 中 的 火车头 ,看了的都说好😃 亲身经历

五、养成代码习惯

养成固定码风。

比如,我喜欢在 意义/功能 不同的代码段中间空行。
突出代码逻辑,方便检查、阅读。

这篇关于算法竞赛:一些c++的奇技淫巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/547235

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么