2044OI代码规范
前言
2044 OI 代码规范(下面简称“规范”)为 2044 博客的所有题解、算法笔记等代码的标准,大家也可以以此规范作为参考。
本规范仅适用于 C++ 代码
对于变量和常量
- 变量应当使用下划线命名,除题意说明外,应尽量减少毫无意义的变量名。
- 尽可能的减少全局变量的使用。
- 常量应该为全大写字母,并使用
const定义。 - 除非数据范围需要,尽量减少对于
long long等类型的使用。 - 应当为
bool的变量尽量不用int,long long等类型。
符合规定的定义:
int age = 10;
bool gender = 1;
不符合规定的定义:
int hoheiheiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 114514;
long long age = 10;
对于函数与结构体
- 函数的类型尽量不用
auto关键字。 - 函数名与结构体名命名应使用下划线命名法或者大驼峰命名法。
- 函数(结构体)名应该可以表达它的意思,除题意说明,不应该使用毫无意义的函数(结构体)名。
- 函数最后应该有明确的返回值 (
void类型除外)。 - 一个函数内代码量大于等于 \(15\) 行的单一功能代码块,应当抽象成函数。
符合规定的定义:
bool isprime(int n)
{
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
不符合规定的定义:
auto f(double a, double b)
{
if (a % 2 == 0)
{
return b;
}
}
对于运算符
- 双目运算符前后应当各有个空格。
- 单目运算符前应当有一个空格。
- 左括号前应当有一个空格。左括号有应当有一个空格。
- 右大括号应当独占一行。
- 左大括号要么独占一行,要么和上一行的最后一个符号,以空格隔开。
- 对于表达式里重复两次及以上的子表达式,应当用宏定义或者函数抽象出来。
符合规定的定义:
for (int i = 1; i <= n; i++)
{
if (!arr[i])
{
cout << i << " ";
}
else {
cout << i * i << " ";
}
}
不符合规定的定义:
for(int i=1;i<=n;i++){if(!arr[i]){cout<<i<<" ";}else{cout<<i*i<<" ";}}
其他规定
- 无论缩进代码块有几行,都必须使用大括号并缩进。
- 头文件必须写在开头。
- 对于诸如
#ifdef DEBUG的调试语句,之间的代码应当缩进。 - 最大缩进格数不应超过 \(4\),极端情况下不能超过 \(5\),最好不要超过 \(3\),对于缩进格数较多的代码块,应使用提取函数、提前返回等手段减少缩进。
- 最后的成品代码应当删除用来调试的注释语句。
示范代码
源自文章AT_abc057_d 题解,代码如下:
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
long long YangHuiTraingle[55][55]; // 杨辉三角,排列组合用
void init()
{
YangHuiTraingle[0][0] = 1;
for (int i = 1; i <= 50; i++)
{
YangHuiTraingle[i][0] = 1;
for (int j = 1; j <= i; j++)
{
YangHuiTraingle[i][j] = YangHuiTraingle[i - 1][j] + YangHuiTraingle[i - 1][j - 1];
}
}
}
long long arr[114514];
int n, A, B;
long long average = 0.0; // 平均值
int main()
{
init();
cin >> n >> A >> B;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
// 排序,注意 greater要用 long long
sort(arr + 1, arr + n + 1, greater<long long>());
long long choose = 0; // 选择了多少元素?
long long choosebefore = 0; // 表示 k_1
long long chooseafter = 0; // 表示 k_2
for (int i = 1; i <= n; i++)
{
// 这是刚开始写错的,不用过多理会
if (choose < A)
{
average += arr[i];
choose++;
}
else if (choose > B)
{
break;
}
else if (choose >= A && arr[i] > average)
{
average += arr[i];
choose++;
}
}
for (int i = 1; i <= n; i++)
{
if (arr[i] == arr[A])
{
choosebefore++;
if (i <= A)
{
chooseafter++;
}
}
}
long long ans2 = 0;
if (arr[1] == arr[A])
{
for (int i = A; i <= B; i++)
{
ans2 += YangHuiTraingle[choosebefore][i];
}
}
else
{
ans2 += YangHuiTraingle[choosebefore][chooseafter];
}
printf("%.6lf\n%lld", (average / (double)(choose)), ans2);
}

浙公网安备 33010602011771号