• Codeforces Round #666 (Div. 2)


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

    A. Juggling Letters

    题意

    给出 $n$ 个字符串,可在字符串间任意移动字母,问最终能否使这 $n$ 个字符串相同。

    题解

    如果可以,因为 $n$ 个字符串相同,所以每个字母的数量一定是 $n$ 的倍数。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n;
        cin >> n;
        vector<int> cnt(26);
        for (int i = 0; i < n; i++) {
            string s;
            cin >> s;
            for (char c : s) ++cnt[c - 'a'];
        }
        bool ok = all_of(cnt.begin(), cnt.end(), [&](int x) {
            return x % n == 0;
        });
        cout << (ok ? "YES" : "NO") << "
    ";
    }
    
    int main() {
        int t; 
        cin >> t;
        while (t--) solve();
    }

    B. Power Sequence

    题意

    给出一个大小为 $n$ 的数组 $a$,允许操作如下:

    • 重排数组,无花费
    • 将一个数 $+1$ 或 $-1$,花费为 $1$

    找出使得数组 $a$ 满足 $a_i = c^i$ 的最小花费。

    题解

    指数增长,枚举 $c$ 即可。

    因为 $3 le n le 10^5, 1 le a_i le 10^9$,所以可以将上限设为 $10^{14}$,一旦有 $c^i$ 大于这个上限就停止枚举。

    代码

    #include <bits/stdc++.h>
    using ll = long long;
    using namespace std;
    int main() {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++)
            cin >> a[i];
        sort(a.begin(), a.end());
        ll ans = LLONG_MAX;
        for (int c = 1; true; c++) {
            bool too_big = false;
            ll change = 0;
            ll cur = 1;
            for (int i = 0; i < n; i++) {
                change += abs(a[i] - cur);
                cur *= c;
                if (cur > 1e14) {
                    too_big = true;
                    break;
                }
            }
            if (too_big) break;
            ans = min(ans, change);
        }
        cout << ans << "
    ";
    }

    C. Multiples of Length

    题意

    给出一个大小为 $n$ 的数组 $a$,操作如下:

    • 选择一个区间,给其中的每个数加上区间长度的一个倍数

    共要进行 $3$ 次操作,找出使得数组 $a$ 满足 $a_i = 0$ 的一种方案。

    题解

    $gcd(n,n-1)=1$,所以选择一次长为 $n$ 的区间,两次长为 $n - 1$ 的区间。

    代码

    #include <bits/stdc++.h>
    using ll = long long;
    using namespace std;
    int main() {
        int n;
        cin >> n;
        vector<ll> a(n);
        for (int i = 0; i < n; i++)
            cin >> a[i];
        if (n == 1) {
            cout << 1 << ' ' << 1 << "
    " << -a[0] << "
    "
                 << 1 << ' ' << 1 << "
    " << 0 << "
    "
                 << 1 << ' ' << 1 << "
    " << 0 << "
    ";
            return 0;
        }
        cout << 1 << ' ' << n << "
    ";
        for (int i = 0; i < n; i++) {
            cout << -a[i] * n << " 
    "[i == n - 1];
        }
        cout << 1 << ' ' << n - 1 << "
    ";
        for (int i = 0; i < n - 1; i++) {
            cout << a[i] * (n - 1) << " 
    "[i == n - 2];
        }
        cout << 2 << ' ' << n << "
    ";
        for (int i = 1; i < n; i++) {
            cout << a[i] * (i == n - 1 ? n - 1 : 0) << " 
    "[i == n - 1];
        }
    }

    D. Stoned Game

    题意

    有 $n$ 堆石子,两个人每次从另一个人没取过的石子堆中拿走一颗石子,无法再取者败,判断最终胜者。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int n; 
        cin >> n;
        vector<int> a(n);
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            sum += a[i];
        }
        sort(a.begin(), a.end());
        if (a.back() > sum - a.back())
            cout << "T" << "
    ";
        else
            cout << (sum & 1 ? "T" : "HL") << "
    ";
    }
    
    int main() {
        int t; 
        cin >> t;
        while (t--) solve();
    }
  • 相关阅读:
    ohmyzsh
    https://github.com/
    init 0,1,2,3,4,5,6
    关于反射
    docker学习笔记
    docker常见问题汇总
    ArrayList的sublist
    java-锁
    CAS-原子操作
    hashMap与concurrentHashMap
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13598738.html
Copyright © 2020-2023  润新知