传奇算法竞赛选手jiangly:代码风格分析与总结(长期更新)

本文参考:
GitHub - lihaoze123/jiangly-s-code-style-for-xcpc

已经过作者同意

本文主要是分析和总结jiangly代码风格,本文会在之后的时间里面长期更新,主要更新各种代码编写的细节,之后也会在这里写一些jiangly老师的模板,主要参考的是jiangly在codeforces和atcoder等网站的提交内容:
Personal submissions - Codeforces

目录

传奇选手jiangly简单介绍:

蒋老师代码风格分析:

基础:

进阶细节:

1.命名问题:

2.更多细节:

持续更新中....

蒋老师的模板写法:


传奇选手jiangly简单介绍:

考虑到部分入门算法竞赛的新手不了解,我稍微介绍一下jiangly选手:

好了,介绍完了

无需多言:jiangly - Codeforces,最高4039分,人类历史记录

以下文章中,jiangly都用蒋老师代替

蒋老师代码风格分析:

我们可以看一段蒋老师的提交:
Submission #310047719 - Codeforces
来自最近的一场div3的D题

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;

int floorSqrt(i64 n) {
    int x = std::sqrt(n);
    if (1LL * x * x > n) {
        x--;
    }
    return x;
}

void solve() {
    int n, m;
    std::cin >> n >> m;
    
    std::vector<std::array<int, 2>> a;
    std::vector<int> x(n), r(n);
    for (int i = 0; i < n; i++) {
        std::cin >> x[i];
    }
    for (int i = 0; i < n; i++) {
        std::cin >> r[i];
    }
    
    for (int i = 0; i < n; i++) {
        for (int j = -r[i]; j <= r[i]; j++) {
            int y = floorSqrt(1LL * r[i] * r[i] - 1LL * j * j);
            a.push_back({x[i] + j, y});
        }
    }
    
    std::sort(a.begin(), a.end());
    i64 ans = 0;
    for (int l = 0, r = 0; l < a.size(); l = r) {
        while (r < a.size() && a[l][0] == a[r][0]) {
            r++;
        }
        int y = 0;
        for (int i = l; i < r; i++) {
            y = std::max(y, a[i][1]);
        }
        ans += 2 * y + 1;
    }
    
    std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t;
    std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}

可以看出

基础:

1.蒋老师不用命名空间,而是用std::前缀代替,这也是符合c++工程项目的基本代码风格

2.头文件只用万能头文件#include<bits/stdc++.h>节省空间

3.并没使用#define或者#typedef来为数据类型取别名,而是使用using关键字

4.对数据类型long long的命名,命名成i64而不是ll,语义清晰,阅读代码可以直接看出这是64位的整数类型。

using i64 = long long;

5.tap为4个空格的缩进

6.输入,输出和运算符之间都用空格进行隔开,例如:

int main() {
    int n, m;
    std::cin >> n >> m;

}

int main() {
    int ans = 2 * y - 1;    
}

7.使用C++现代化语法,std::cin ,std::cout ,使用现代化的数组std::vector<int> a而不是在代码前面开固定空间的数组int a[n]

8.进行一次操作之后空一行,也就是每一个意义独立的代码块都隔开,比如进行了数组长度的输入之后,空一行再进行数组元素的输入,例如:

void solve() {
    int n;
    std::cin >> n;

    std::vector<int> a(n);
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }

}

9.if,for和后面的左括号之间有一个空格,右括号和后面大括号之间也有一个空格,for循环中,分号之间也要有空格

例如:

if (a == b) {
    
}

for (int i = 0; i < n; i++) {
    
}

进阶细节:

1.命名问题:

题目中出现的变量名,就优先使用,而不是随便命名

例如在codeforces中:

那么蒋老师是在solve()函数中这么写的:

void solve() {
    int n, m;
    std::cin >> n >> m;

    std::vector<int> x(n), r(n);
    for (int i = 0; i < n; i++) {
        std::cin >> x[i];
    }
    for (int i = 0; i < n; i++) {
        std::cin >> r[i];
    }

}

变量名是完全按照题目中说明的使用的

还有在Atcoder中:

蒋老师是这么写的:

int main() {
    int N;
    std::cin >> N;
    
    std::vector<int> A(N);
    for (int i = 0; i < N; i++) {
        std::cin >> A[i];
    }

}

2.更多细节:

持续更新中....

蒋老师的模板写法:

持续更新中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值