跳转至

Codeforces Round 1014 (Div. 2)

2025-03-30

赛时出了ABCD,这场上了87分,排名691,又是打得还不错的一场。但是其实后面还有四十分钟就不太想看E了,连题都没咋读,等会再好好看一看吧。

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

感觉这场C是非常简单的一集,D也偏简单的,纯模拟没有任何算法。或许放到几天之前,我可能就不太想写关电脑了,虽然也不一定能写出来。

A

\(gcd(x,y)=gcd(x,y-x)\)

\(gcd(x+k,y+k)=gcd(x+k,y-x)\)

所以最大的可能的最大公因数一定是 \(y-x\) ,且只要让 \(x+k\)\(y-x\) 的倍数,则一定可以有这种情况。

void ChatGptDeepSeek()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort(a.begin() + 1, a.end());
    cout << a[n] - a[1] << '\n';
}

B

第一排的奇数位的只能去第二排的偶数位,所以第一排的奇数位的\(1\) + 第二排的偶数位的 \(1\) 数量必须小于等于第二排的偶数位置的数量。

另一边同理。

void ChatGptDeepSeek()
{
    int n;
    cin >> n;
    string s1, s2;
    cin >> s1 >> s2;
    int cnt1 = 0, cnt2 = 0;
    for (int i = 0; i < n; i++)
    {
        if (s1[i] == '1')
        {
            if (i % 2 == 0)
                cnt1++;
            else
                cnt2++;
        }
        if (s2[i] == '1')
        {
            if (i % 2 == 0)
                cnt2++;
            else
                cnt1++;
        }
    }
    int x = n / 2;
    if (cnt1 > x || cnt2 > n - x)
    {
        cout << "NO\n";
    }
    else
    {
        cout << "YES\n";
    }
}

C

我们假设把所有奇数全都给加到偶数上,那么最后我们数组会有若干个奇数和若干个偶数,我们可以把所有的偶数都给加到1个 \(1\) 上。

也就是说答案会是总和减去 奇数的数量-1 。

void ChatGptDeepSeek()
{
    int n;
    cin >> n;
    vector<int> a(n + 1), p, q;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (a[i] & 1)
            p.push_back(a[i]);
        else
            q.push_back(a[i]);
    }
    sort(a.begin(), a.end());
    sort(p.begin(), p.end());
    sort(q.begin(), q.end());
    if (p.empty() || q.empty())
    {
        cout << a[n] << '\n';
        return;
    }
    long long ans = 0;
    for (int i = 1; i <= n; i++)
        ans += a[i];
    ans -= p.size() - 1;
    cout << ans << '\n';
}//3 3 4 5 9

D

\(n\) 的规模很小很小,手推一下发现并不需要很多次操作就可以完成,且不合法情况很少。

于是直接模拟,有限放数量少的,不行则放数量第二少的,否则放最多的。若不能操作,则直接退出。

void ChatGptDeepSeek()
{
    int n;
    cin >> n;
    vector<int> cnt(130);
    string s;
    cin >> s;
    for (int i = 0; i < n; i++)
    {
        cnt[s[i]]++;
    }
    vector<int> a(3);
    a[0] = cnt['L'], a[1] = cnt['I'], a[2] = cnt['T'];
    sort(a.begin(), a.end());
    vector<int> ans;
    auto Ins = [&](char ch)
    {
        for (int i = 0; i + 1 < s.size(); i++)
        {

            if (s[i] != s[i + 1] && s[i] != ch && s[i + 1] != ch)
            {
                s.insert(s.begin() + i + 1, ch);
                cnt[ch]++;
                a[0] = cnt['L'], a[1] = cnt['I'], a[2] = cnt['T'];
                sort(a.begin(), a.end());
                ans.push_back(i + 1);
                return true;
            }
        }
        return false;
    };
    // Ins('T');
    // cerr<<s<<'\n';
    while (1)
    {
        // break;
        if (a[0] == a[2])
            break;
        if (cnt['L'] == a[0])
        {
            if (Ins('L'))
                continue;
            else
            {
                if (cnt['I'] == a[1])
                {
                    if (Ins('I'))
                        continue;
                    else if (Ins('T'))
                        continue;
                }
                else
                {
                    if (Ins('T'))
                        continue;
                    else if (Ins('I'))
                        continue;
                }
            }
        }
        else if (cnt['I'] == a[0])
        {
            if (Ins('I'))
                continue;
            else
            {
                if (cnt['L'] == a[1])
                {
                    if (Ins('L'))
                        continue;
                    else if (Ins('T'))
                        continue;
                }
                else
                {
                    if (Ins('T'))
                        continue;
                    else if (Ins('L'))
                        continue;
                }
            }
        }
        else
        { // T
            if (Ins('T'))
                continue;
            else
            {
                if (cnt['L'] == a[1])
                {
                    if (Ins('L'))
                        continue;
                    else if (Ins('I'))
                        continue;
                }
                else
                {
                    if (Ins('I'))
                        continue;
                    else if (Ins('L'))
                        continue;
                }
            }
        }
        cout << "-1\n";
        return;
    }
    // cerr << s << '\n';
    cout << ans.size() << '\n';
    for (auto x : ans)
        cout << x << '\n';
}

看起来代码很多,但实际上三个差不多,主要是得枚举字符。。当然还有更智慧的写法。