欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代码规范

程序员文章站 2022-05-26 16:17:33
...

前言

众所周知,人类具有的本质,而我仅仅是突然觉得打空格挺好看,就写了这个文章,所以此文章说出的话是极有可能被我放掉的。

另外,这个仅针对OI,其他的懒得写。
代码规范

参考博客

主要是这两位神犇的神作_rqy’s Code Style for OI
XXX(记不得了以后想起再说吧)

代码风格

概览

  • 所有的#include均放在文件开头,#include<>之间有一个空格;
  • 引用的头文件按字典序排列;
  • 不应用using namespace std;(避免重名,虽然以我的命名规则很难重名);
  • 能用const就不用#define
  • main返回值为int(哪天如果long long调疯了这一条有可能会展示被屏蔽),return 0;不忽略。

空白符

缩进

  • 所有缩进均为44个空格(不是11个制表符,因为CB太♂了)。

空格

  • 通常双目(三目)运算符两侧各有一个空格;
  • 中括号两侧无空格;
  • 小括号内侧无空格,外侧若是forwhileif等保留字或花括号等,则有一个空格,否则(如函数名)无空格;
  • 左花括号前有一个空格;
  • ,;之后不是换行,则有一个空格;
  • ->.::和单目运算符等符号不加空格;
  • 重载运算符时,重载的符号两侧有空格;
  • 常成员函数const两侧有空格;
  • //若不在(不计空格)行首,则前面有一个空格,后面始终有一个空格;
  • 其他随缘。

换行

  • 函数、结构体之间有换行;
  • 头文件下面有换行;
  • 文末有个换行(老式编译器遗留的传统);
  • 其他随缘。

花括号

  • 花括号不换行(拒绝反对,换行者异端也)(我不会告诉你我在一年多前花括号是要换行的);
  • ifforwhile等后面只有一行的不写花括号。

压行

  • 我觉得美观为准。

命名

  • 大部分参数和局部变量以33个字母的小写缩写命名;
  • 全局变量和函数首字母大写;
  • 如果名称超过一个单词,采用驼峰命名法;
  • 通常题目中出现的变量首字母大写;
  • 其他随缘。

其他

  • sizeof后面用空格而不是小括号;
  • 注释掉代码时//加在行首。

示例代码

[洛谷P2540]【NOIP2015】斗地主增强版

#include <algorithm>
#include <cstdio>
#include <cstring>

int Read() {
    int x = 0;
    char c = getchar();
    while (c < '0' || c > '9')
        c = getchar();
    while (c >= '0' && c <= '9')
        x = x * 10 + (c ^ 48), c = getchar();
    return x;
}

const int MAXN = 13;
const int MinNum[5] = {0, 5, 3, 2};

int Ans;
int Card[MAXN + 5];

int Fixed[MAXN / 4 + 5][MAXN / 3 +5][MAXN / 2 + 5][MAXN + 5];
// Fixed[四张][三张][对子][单牌]

inline void toMin(int &cur, int upd) {
    cur = std::min(cur, upd);
}

void Prepare(int N) {
    Fixed[0][0][0][0] = 0;
    for (int i = 0; i <= N; i++)
        for (int j = 0; j <= N; j++)
            for (int k = 0; k <= N; k++) {
                for (int l = 0; l <= N; l++) {
                    if (i * 4 + j * 3 + k * 2 + l > N)
                        continue;
                    int &cur = Fixed[i][j][k][l];
                    cur = i + j + k + l; // 一张一张出完
                    if (i) {
                        toMin(cur, Fixed[i - 1][j][k][l] + 1); // 直接出
                        toMin(cur, Fixed[i - 1][j + 1][k][l + 1]); // 变成三张一样的和一张单牌出
                        if (i >= 2) toMin(cur, Fixed[i - 2][j][k][l] + 1); // 两炸拆成四带两个一样的对子出
                        if (k >= 1) toMin(cur, Fixed[i - 1][j][k - 1][l] + 1); // 带上以前的两个一样的单牌出
                        if (k >= 2) toMin(cur, Fixed[i - 1][j][k - 2][l] + 1); // 拆成两个对子出
                        if (l >= 2) toMin(cur, Fixed[i - 1][j][k][l - 2] + 1); // 带上以前的两个单牌出
                    }
                    if (j) {
                        toMin(cur, Fixed[i][j - 1][k][l] + 1); // 直接出
                        toMin(cur, Fixed[i][j - 1][k + 1][l + 1]); // 变成一个对子和一张单牌出
                        if (k >= 1) toMin(cur, Fixed[i][j - 1][k - 1][l] + 1); // 带上以前的一个对子出
                        if (l >= 1) toMin(cur, Fixed[i][j - 1][k][l - 1] + 1); // 带上以前的一张单牌出
                    }
                    if (k)
                        toMin(cur, Fixed[i][j][k - 1][l] + 1); // 直接出
                    if (l)
                        toMin(cur, Fixed[i][j][k][l - 1] + 1); // 直接出
                }
            }
}

int Cnt[MAXN + 5];

inline int Go(int i, int j, int k, int l, int jok){
    if (jok <= 1)
        return Fixed[i][j][k][l + jok];
    return std::min(Fixed[i][j][k][l] + 1, Fixed[i][j][k][l + 2]);
}

void Dfs(int tot) {
    if (tot >= Ans)
        return;
    memset(Cnt, 0, sizeof Cnt);
    for (int i = 2; i <= 14; i++)
        Cnt[Card[i]]++;
    toMin(Ans, tot + Go(Cnt[4], Cnt[3], Cnt[2], Cnt[1], Card[0]));
    for (int k = 1; k <= 3; k++)
        for (int i = 3; i <= 14; i++) {
            int j = i;
            while (j <= 14 && Card[j] >= k) {
                Card[j] -= k;
                if (j - i + 1 >= MinNum[k])
                    Dfs(tot + 1);
                j++;
            }
            while (--j >= i)
                Card[j] += k;
        }
}

int main() {
    int T = Read(), N = Read();
    Prepare(N);
    while (T--) {
        memset(Card, 0, sizeof Card);
        for (int i = 1; i <= N; i++) {
            int num = Read(), col = Read();
            if (num == 1)
                num = 14;
            Card[num]++;
        }
        Ans = N, Dfs(0);
        printf("%d\n", Ans);
    }
    return 0;
}

亮版:
代码规范
暗版:
代码规范

相关标签: 代码