算法竞赛:一些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++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

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 越界访问的实际危害二、基