算法竞赛:一些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++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf