Codeforces Round 913 (Div. 3)

发布时间 2023-12-17 16:42:20作者: goodluckbear

Codeforces Round 913 (Div. 3)

A:ABC

A. Rook

简单题,就两个循环搞定(直接上码)

#include <bits/stdc++.h>

using namespace std;

void solve() {
    char a;
    int b;
    cin >> a >> b;
    for (int i = 1; i <= 8; i++) {
        if (i != b) {
            cout << a << i << endl;
        }
    }
    for (int i = 0; i < 8; i++) {
        char x = 'a' + i;
        if (x != a) {
            cout << x << b << endl;
        }
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

B. YetnotherrokenKeoard

题意:遇到'B'右边第一个大写字母删除,遇到'b'右边第一个小写字母删除

思路:从后往前遍历,然后记录bB的数量

最开始想太多直接从前面遍历然后就T了,后面一想发现自己好傻

#include <bits/stdc++.h>

using namespace std;
const int MAX = 1e6 + 10;
char a[MAX];

void solve() {
    string st;
    cin >> st;
    int x1 = 0, x2 = 0;
    int l = 0;
    for (int i = st.size() - 1; i >= 0; i--) {
        if (st[i] == 'b') {
            x1++;
        } else if (st[i] == 'B') {
            x2++;
        } else if (st[i] >= 'a' && st[i] <= 'z' && x1) {
            x1--;
        } else if (st[i] >= 'A' && st[i] <= 'Z' && x2) {
            x2--;
        } else {
            a[l] = st[i];
            l++;
        }
    }
    for (int i = l - 1; i >= 0; i--) {
        cout << a[i];
    }
    cout << "\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C. Removal of Unattractive Pairs

题意:删除两个相同的字符,使得字符串长度最短

思路:统计最多的字符的数量

#include <bits/stdc++.h>

using namespace std;
#define int long long
int a[26];

void solve() {
    memset(a, 0, sizeof a);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        char x;
        cin >> x;
        a[x - 'a']++;
    }
    int ma = 0;
    for (int i = 0; i < 26; i++) {
        ma = max(a[i], ma);
    }
    //cout<<"ma:"<<ma<<"\n";
    if (ma * 2 >= n) {
        cout << ma * 2 - n << "\n";
    } else {
        if (n % 2) {
            cout << "1\n";
        } else cout << "0\n";
        /*
        int res = 0;
        sort(a, a + 26);
        for (int i = 25; i >= 0; i--) {
            cout << "res:" << res << "\n";
        }
        cout << abs(res) << endl;
         */
    }
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

D. Jumping Through Segments

题意:给定n个区间,每次跳到一个区间求跳跃距离的最小值

思路:最大值的最小,所以:二分!!!

(都是给n个区间,直接想成acvv上的板子题了,于是sort一下就出来了,然后样例给了我狠狠一击)

#include <bits/stdc++.h>

using namespace std;
const int MAX = 2e5 + 10;
int l[MAX], r[MAX];
int n;

bool check(int k) {
    int lx = 0, rx = 0;
    for (int i = 1; i <= n; i++) {
        int l1 = lx - k, r1 = rx + k;
        if (l1 > r[i] || r1 < l[i]) {
            return false;
        }
        lx = max(l1, l[i]);
        rx = min(r[i], r1);
    }
    return true;
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> l[i] >> r[i];
    }
    int L = 0, R = 1e10;
    while (L <= R) {
        int m = (L + R) >> 1;
        if (check(m)) R = m - 1;
        else L = m + 1;
    }
    cout << R + 1 << endl;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

E. Good Triples

题意:有一个三元组让
$$
digsum(a)+digsum(b)+digsum(c)=digsum(n)
$$

$$
a+b+c=n
$$

思路:可以从每一个数位上下手至于证明这东西我证不出来于是直接贴一个知乎上大佬的证明算了

证明:

假设求和时向高一位借数了,比如借了一个数。

如果高一位>=1,不会向高二位借数,相对于不借数的情况,左边的dig+10,右边的dig+1,这样在这一位左边的显然增加了9,高一位考虑答案时和当前位一样,左右的dig差值只会更大。举个例子,9+1+2=12

如果高二位==0,向高二位借数,这里假设能借到数,相对于不借数的情况,左边当前位dig+10,高一位dig+9,右边dig+1,右边高位如果借不到数还要增加dig,左右dig差值至少增加了18。举个例子,2+99+1=102

借两个数也是一样,也就是说只要借数了必然会导致dig的增加

考虑单独一位,只有不借数左右两边的dig才能相等!

#include <bits/stdc++.h>

using namespace std;
#define int long long
int cnt[20];

void solve() {
    string n;
    cin >> n;
    int res = 1;
    for (int i = 0; i < n.size(); i++) {
        res *= cnt[n[i] - '0'];
    }
    cout << res << endl;
}

void init() {
    for (int i = 0; i <= 9; i++) {
        for (int j = 0; j + i <= 9; j++) {
            for (int k = 0; i + j + k <= 9; k++) {
                cnt[i + k + j]++;
            }
        }
    }
}

signed main() {
    int t;
    cin >> t;
    init();
    while (t--) {
        solve();
    }
}