本文主要是介绍算法竞赛:一些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++的奇技淫巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!