代码风格

1.文件结构与头文件

  • 使用 #include <bits/stdc++.h>
    竞赛环境通常支持,可减少记忆头文件的负担,提高编码速度。若环境不支持,则按需包含。

    建议使用标准的头文件

  • 必须使用 using namespace std;
    简洁优先,避免代码冗长。

#include <bits/stdc++.h>
using namespace std;

万能头文件的缺点

  1. 编译时间增加
    虽然 OI 通常不限制编译时间,但在一些在线评测系统中,如果编译器需要处理大量头文件,可能会轻微增加编译耗时。不过对大多数竞赛环境来说,这点影响可忽略。
  2. 非标准,可移植性差
    该头文件并非 C++ 标准的一部分,只在 GCC 环境中可用(包括 MinGW、Clang 在某些模式下也支持)。如果比赛环境使用其他编译器(如 MSVC 或未配置的 GCC),代码可能无法编译。
  3. 命名冲突风险
    由于包含了大量命名空间中的符号,可能会意外与自定义变量名冲突(虽然概率很低,但理论上存在)。
  4. 部分竞赛明令禁止
    少数严格的竞赛(如 NOI 某些年份的官方比赛)可能要求选手不得使用 bits/stdc++.h,或环境未预置该文件。若习惯依赖它,遇到此类限制会手忙脚乱。

2. 主函数规范

  • 主函数必须返回 int,并以 return 0; 结束
  • **使用 int main(),不使用 void main()**。
int main() {
// 代码
return 0;
}

3. 代码排版

  • 缩进:使用 2 个空格4 个空格,统一即可。不用 Tab(不同编辑器显示宽度不同)。
  • 大括号风格:采用 K&R 风格(左括号不换行),节省行数且清晰。
if (condition) {
// ...
} else {
// ...
}

for (int i = 0; i < n; i++) {
// ...
}
  • 运算符两侧加空格,逗号后加空格,增强可读性。
int a = b + c;
int x = (a > b) ? a : b;
for (int i = 0; i < n; i++) { }

4. 命名规范

  • 变量名:小写字母 + 下划线(snake_case),如 max_valuenode_cnt
  • 常量:全大写 + 下划线,如 const int MAXN = 1e5 + 10;
  • 全局变量:可在前面加 g_ 前缀(可选),以明确作用域。
  • 结构体 / 类名:首字母大写(PascalCase),如 struct Node
  • 避免使用 i, j, k 以外的单字母变量名,除非是极短的循环或数组下标

5. 变量定义

  • 变量尽量在使用时定义,避免在函数开头全部堆砌。这符合 C++ 的习惯,也有助于减少未初始化的问题。
  • 循环变量在 for 语句内定义
for (int i = 0; i < n; i++) { }
  • 全局变量默认初始化为 0,但局部变量需显式初始化。

6. 输入输出

  • 使用 cin / cout 时,务必关闭同步
ios::sync_with_stdio(false);
cin.tie(nullptr);
  • 之后不要再混用 scanf / printf
  • 若追求极致速度,可使用 scanf / printf 或手写快读。

7. 常量与宏

  • constconstexpr 定义常量,避免使用 #define 定义数值,除非是调试用的宏。
const int MAXN = 2e5 + 5;
const int INF = 0x3f3f3f3f;
  • #define 可用于简化长代码段的书写(如 rep(i, n)),但需谨慎使用,且团队内保持一致。

8. 数组与下标

  • 数组大小用常量定义,多开 5~10 的冗余防止越界。
  • 下标从 0 开始,除非题目明确从 1 开始更自然(如图论邻接表)。
  • 若从 1 开始,访问时保持一致性,避免混用。

9. 结构体与排序

  • 重载 < 运算符或定义比较函数时,注意 const 正确性。
struct Node {
int id, val;
bool operator<(const Node& other) const {
return val < other.val;
}
};
  • 使用 sort(v.begin(), v.end()) 进行排序。

10. 调试与提交

  • 调试时使用 #ifdef LOCAL 包裹输出语句,提交前确保关闭。
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// 调试输出
#endif
  • 提交前 删除所有调试输出,或通过条件编译屏蔽。

11. 典型代码模板

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 5;
const int INF = 0x3f3f3f3f;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);

int n;
cin >> n;
// 解题逻辑

return 0;
}