算法竞赛:一些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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程