Processing math: 100%
跳转至

我的 C++ 代码规范

以 UOJ22 外星人一题的代码为例

#include <bits/stdc++.h>

typedef long long int ll;
const int maxn = 1e3 + 19, maxv = 5e3 + 19, mod = 998244353;

int n, x, a[maxn], dp[maxn][maxv];
bool ok[maxv], tmp[maxv];

int solve(int y){
    dp[0][y] = 1;
    for(int i = 1; i <= n; ++i)
        for(int j = 0; j <= x; ++j)
            dp[i][j] = (dp[i - 1][j % a[i]] + (ll)dp[i - 1][j] * (i - 1)) % mod;
    return dp[n][x];
}

int main(){
    std::scanf("%d%d", &n, &x);
    for(int i = 1; i <= n; ++i)
        std::scanf("%d", a + i);

    std::sort(a + 1, a + 1 + n);

    ok[x] = true;
    for(int i = n; i >= 1; --i){
        for(int j = 0; j <= x; ++j)
            if(ok[j])
                tmp[j % a[i]] = true, tmp[j] = true;
        std::copy(tmp, tmp + x + 1, ok);
        std::fill(tmp, tmp + x + 1, false);
    }

    for(int i = a[1] - 1; i >= 0; --i)
        if(ok[i]){
            std::printf("%d\n%d\n", i, solve(i));
            return 0;
        }

    return 0;
}
  1. 为了方便,使用 bits/stdc++.h 作为头文件。
  2. 如果需要使用 64 位整数或 64 位无符号整数,则使用 typedef 定义别名为 llull
  3. 为了美观,使用制表符缩进。
  4. 数组大小用常量定义,模数也为常量。
  5. 为了防止从 1 开始标号导致的越界,数组大小为其最大值加上 1919 是一个幸运数字。
  6. 可以用前缀自加替换时,不使用后缀自加。
  7. 绝对不使用 using namespace std
  8. 大括号紧跟函数声明,不用空格或是换行分隔。
  9. 即使是来自于 C 库的函数,也要使用 std:: 解析作用域。
  10. 除非特殊情况,不使用流输入输出。
  11. 除了 ()! 和前后缀自加等运算符,所有变量和运算符之间都有一个空格。
  12. truefalse 来直接向 bool 类型赋值,而非 10
  13. 不使用 std::memsetstd::memcpy,而使用 std::fillstd::copy
  14. 为了锻炼对复杂代码的适应能力,尽量不使用 C++ 11 的内容。
  15. 各个模块尽量分为一个个函数。较简单的模块可以不写为函数,但要用一个空行与其他模块分隔。
  16. 为了代码美观,不使用宏定义。唯一可以使用宏定义的地方是线段树 #define ls (node << 1)#define rs (node << 1 | 1)。(在极特殊情况下也允许 #define int long long)
  17. 不使用 class
  18. 各个数据结构和可以自然地视作单个对象的结构,在不影响效率的情况下用 struct 进行适度的封装。
  19. 当函数参数为空时,参数声明应为 void;主函数可以不加 void 声明。
  20. 有符号整数不与无符号整数直接比较。要视情况对其中一个强制转换后比较。
  21. 即使可以提前得出答案,也要将数据全部读入。

评论

Gitalking ...