• Codeforces Round #640 (Div. 4)


    比赛链接:https://codeforces.com/contest/1352

    A - Sum of Round Numbers

    题意

    将一个十进制数的每一个非零位分离出来。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        string s; cin >> s;
        int n = s.size();
        vector<string> ans;
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] != '0') {
                ans.push_back(s[i] + string(n - 1 - i, '0'));
            }
        }
        cout << ans.size() << "
    ";
        for (auto i : ans) cout << i << ' ';
        cout << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    B - Same Parity Summands

    题意

    将整数 n 分解为 k 个奇偶性相同的数。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n, k; cin >> n >> k;
        int n1 = n - (k - 1), n2 = n - (k - 1) * 2;
        if (n1 > 0 and n1 % 2 == 1) {
            cout << "YES
    ";
            for (int i = 0; i < k - 1; i++) cout << "1 ";
            cout << n1 << "
    ";
        } else if (n2 > 0 and n2 % 2 == 0) {
            cout << "YES
    ";
            for (int i = 0; i < k - 1; i++) cout << "2 ";
            cout << n2 << "
    ";
        } else {
            cout << "NO" << "
    ";
        }
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    C - K-th Not Divisible by n

    题意

    输出第 k 个不能被 n 整除的数。

    题解

    两个 n 之间有 n - 1 个不能被 n 整除的数,找出 k 中有多少个完整的 n - 1 区间,再对 n - 1 取余即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        long long n, k; cin >> n >> k;
        if (k % (n - 1) == 0)
            cout << k / (n - 1) * n - 1 << "
    ";
        else
            cout << k / (n - 1) * n + k % (n - 1) << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    D - Alice, Bob and Candies

    题意

    n 堆糖果排成一排,Alice 只能从左边取,Bob 只能从右边取,每次一人取得的糖果数需多于另一人上一次取得的糖果数,问所有糖果取完时二人共取了多少次,以及各自取得的糖果个数。

    题解

    模拟即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n; cin >> n;
        int a[n] = {}; for (auto &i : a) cin >> i;
        int l = 0, r = n - 1;
        int ans_l = 0, ans_r = 0;
        int pre_l = 0, pre_r = 0;
        int i;
        for (i = 0; l <= r; i++) {
            int sum = 0;
            if (i % 2 == 0) {
                while (l <= r and sum <= pre_r) {
                    sum += a[l];
                    ++l;
                }
                ans_l += sum;
                pre_l = sum;
            } else {
                while (r >= l and sum <= pre_l) {
                    sum += a[r];
                    --r;
                }
                ans_r += sum;
                pre_r = sum;
            }
        }
        cout << i << ' ' << ans_l << ' ' << ans_r << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    E - Special Elements

    题意

    统计数组 a 中有多少元素可以被连续子数组加和求得。

    题解

    数据范围较小,$O_{(n^2)}$ 枚举即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int M = 8100;
    int n, a[M], cnt[M];
    
    void solve() {
        fill(cnt, cnt + M, 0);
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> a[i], ++cnt[a[i]];
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            int sum = a[i];
            for (int j = i + 1; j < n; j++) {
                sum += a[j];
                if (sum < M and cnt[sum]) {
                    ans += cnt[sum];
                    cnt[sum] = 0;
                }
            }
        }
        cout << ans << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    F - Binary String Reconstruction

    题意

    构造一个 01 串,要求:

    • 00 的个数为 n0 个
    • 01 的个数为 n1 个
    • 11 的个数为 n2 个

    题解

    依次构造 11,10,00 即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n0, n1, n2; cin >> n0 >> n1 >> n2;
        vector<int> ans;
        if (n1 or n2) ans.push_back(1);
        for (int i = 0; i < n2; i++) ans.push_back(1);
        for (int i = 0; i < n1 / 2; i++) {
            ans.push_back(0);
            ans.push_back(1);
        }
        if (n1 & 1) {
            ans.push_back(0);
            for (int i = 0; i < n0; i++) ans.push_back(0);
        } else {
            if (ans.size()) {
                ans.pop_back();
                for (int i = 0; i < n0; i++) ans.push_back(0);
                ans.push_back(1);
            } else {
                for (int i = 0; i < n0 + 1; i++) ans.push_back(0);
            }
        }
        for (auto i : ans) cout << i;
        cout << "
    ";
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }

    G - Special Permutation

    题意

    构造数 n 的一个排列,使得相邻两数相差在 [2, 4] 之间。

    题解

    顺着 3 1 4 2 构造即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n; cin >> n;
        if (n <= 3) {
            cout << -1 << "
    ";
            return;
        } else {
            for (int i = n - (n % 2 == 0); i >= 5; i -= 2) cout << i << ' ';
            cout << "3 1 4 2 ";
            for (int i = 6; i <= n - (n % 2 == 1); i += 2) cout << i << ' ';
            cout << "
    ";
        }
    }
    
    int main() {
        int t; cin >> t;
        while (t--) solve();
    }
  • 相关阅读:
    POJ-图论-最短路模板(邻接矩阵)
    POJ-图论-并查集模板
    POJ-排序-归并排序与逆序对
    【题目自解】北京大学2018计算机学科夏令营上机考试
    【算法总结】图论-拓扑排序
    【算法总结】图论-最短路径
    【算法总结】图论-最小生成树
    【算法总结】图论-并查集
    iOS程序的生命周期
    6款好用的Python IDE
  • 原文地址:https://www.cnblogs.com/Kanoon/p/12861746.html
Copyright © 2020-2023  润新知