zoukankan      html  css  js  c++  java
  • Codeforces Round #733 (Div. 1 + Div. 2, based on VK Cup 2021

    Codeforces Round #733 (Div. 1 + Div. 2, based on VK Cup 2021 - Elimination (Engine))

    A - Binary Decimal

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n;
            for (k = 0; n; umax(k, n % 10), n /= 10);
            cout << k << '
    ';
        }
        return 0;
    }
    

    B - Putting Plates

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n >> m;
            string s(m, '0'), t(m, '0'), p(m, '0');
            for (int i = 0; i < m; i += 2)
                s[i] = '1';
            cout << s << '
    ';
     
            t[0] = t.back() = '1';
            for (int i = 1; i < n - 1; ++i)
                cout << ((i & 1) || i == n - 2 ? p : t) << '
    ';
            cout << s << "
    
    ";
        }
        return 0;
    }
    

    C - Pursuit

    二分, (check)(O(1))

    bool check(VI& a, VI& b, int mid) {
        int k = (n + mid) / 4;
        if (n <= k)
            return 1;
        if (!k)
            return a.back() + 100 * mid - b.back() >= 0;
        if (k <= mid)
            return a.back() - a[k - 1] + 100 * mid - b.back() >= 0;
        return a.back() - a[k - 1] + 100 * mid - b.back() + b[k - mid - 1] >= 0;
    }
     
    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n;
            VI a(n), b(n);
            for (auto &i : a) cin >> i;
            for (auto &i : b) cin >> i;
            sort(all(a)); sort(all(b));
            for (int i = 1; i < n; ++i)
                a[i] += a[i - 1], b[i] += b[i - 1];
            ll l = 0, r = n;
            while (l < r) {
                int mid = l + r >> 1;
                if (check(a, b, mid)) r = mid;
                else l = mid + 1;
            }
            cout << l << '
    ';
        }
        return 0;
    }
    

    D - Secret Santa

    先全部让(b_i = a_i), 统计每个人收到的礼物数(c_i)

    然后再让所有(c_i <= 1)

    就可以把人分成4堆

    1. 收了礼物没送
    2. 没收没送
    3. 送了没收
    4. 送了收了

    不用考虑(4)

    剩下的适配即可, 看代码注意分出前三堆人的顺寻, 和适配的顺序

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> n;
            VI a(n + 1), b(n + 1), c(n + 1);
            for (int i = 1; i <= n; ++i) {
                cin >> a[i];
                b[i] = a[i];
                ++c[a[i]];
            }
            VI x, y, z;
            for (int i = 1; i <= n; ++i)
                if (c[i] && c[a[i]] > 1) {
                    --c[a[i]];
                    b[i] = 0;
                    x.emplace_back(i);
                }
            for (int i = 1; i <= n; ++i)
                if (c[i] == 0 && c[a[i]] > 1) {
                    --c[a[i]];
                    b[i] = 0;
                    y.emplace_back(i);
                } else if (c[i] == 0)
                    z.emplace_back(i);
            while (!y.empty()) {
                if (!z.empty()) {
                    b[y.back()] = z.back();
                    z.pop_back();
                    z.emplace_back(y.back());
                    y.pop_back();
                } else if (y.size() > 1) {
                    x.emplace_back(y.back());
                    y.pop_back();
                    b[y.back()] = x.back();
                    z.emplace_back(y.back());
                    y.pop_back();
                } else {
                    for (int i = 1; i <= n; ++i)
                        if (b[i]) {
                            b[y.back()] = b[i];
                            b[i] = y.back();
                            y.pop_back();
                            break;
                        }
                }
            }
            while (!x.empty()) {
                b[x.back()] = z.back();
                x.pop_back();
                z.pop_back();
            }
            k = 0;
            for (int i = 1; i <= n; ++i)
                k += a[i] == b[i];
            cout << k << '
    ';
            for (int i = 1; i <= n; ++i)
                cout << b[i] << char(" 
    "[i == n]);
        }
        return 0;
    }
    

    E - Minimax

    分类讨论

    看代码怎么分类输出答案就行了

    int main() {
        IOS;
        for (cin >> _; _; --_) {
            cin >> s;
            map<char, int> cnt;
            for (auto& c : s) ++cnt[c];
     
            if (cnt.size() == 1) {
                cout << s << '
    ';
                continue;
            }
            
            char f = 0;
            for (auto &i : cnt)
                if (i.second == 1) {
                    f = i.first;
                    break;
                }
            if (f) {
                cnt.erase(f);
                cout << f;
                while (!cnt.empty())
                    if (cnt.begin()->second--)
                        cout << cnt.begin()->first;
                    else
                        cnt.erase(cnt.begin());
                cout << '
    ';
                continue;
            }
     
            if (cnt.begin()->second - 1 << 1 <= s.size()) {
                auto p = *cnt.begin();
                cnt.erase(cnt.begin());
                --p.second;
                cout << p.first;
                while (!cnt.empty()) {
                    if (p.second)
                        cout << p.first, --p.second;
                    --cnt.begin()->second;
                    cout << cnt.begin()->first;
                    if (cnt.begin()->second == 0)
                        cnt.erase(cnt.begin());
                }
                if (p.second)
                    cout << p.first;
                cout << '
    ';
                continue;
            }
     
            if (cnt.size() == 2) {
                auto p = *cnt.begin();
                cnt.erase(cnt.begin());
                --p.second;
                cout << p.first;
                while (cnt.begin()->second--)
                    cout << cnt.begin()->first;
                while (p.second--)
                    cout << p.first;
                cout << '
    ';
                continue;
            }
     
            pair<char, int> p = *cnt.begin();
            cnt.erase(cnt.begin());
            cout << p.first << cnt.begin()->first;
            for (--p.second; p.second; --p.second)
                cout << p.first;
            p = *cnt.begin();
            cnt.erase(cnt.begin());
            cout << cnt.begin()->first;
            --cnt.begin()->second;
            cnt[p.first] = p.second - 1;
            while (!cnt.empty())
                if (cnt.begin()->second--)
                    cout << cnt.begin()->first;
                else
                    cnt.erase(cnt.begin());
            cout << '
    ';
        }
        return 0;
    }
    
  • 相关阅读:
    Zuul的核心源码解析
    基于Sentinel的服务保护
    Sentinel
    windows进行配置转发
    Hystrix断路器
    服务熔断Hystrix高级
    微服务架构的高并发问题
    Feign的高级配置
    倒排序原理和实例
    云计算技术的产生、概念、原理、应用和前景
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/15026099.html
Copyright © 2011-2022 走看看