zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 188 题解

    AtCoder Beginner Contest 188

    A,B很简单就不多说

    C - ABC Tournament

    找出前一半的最大值和后一半的最大值,二者中较小的那一个对应的序号就是最后的答案。

    时间复杂度:(mathcal{O}(2^N))

    using ll = long long;
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        ll a[70000];
        int n;
        cin >> n, n = pow(2, n);
        for (int i = 0; i < n; ++i) cin >> a[i];
        ll m1 = a[0], idx = 0;
        for (int i = 1; i < n / 2; ++i)
            if (a[i] > m1) m1 = a[i], idx = i;
        ll m2 = a[n / 2], idxx = n / 2;
        for (int i = n / 2 + 1; i < n; ++i)
            if (a[i] > m2) m2 = a[i], idxx = i;
        cout << (m1 < m2 ? idx + 1 : idxx + 1) << "
    ";
        return 0;
    }
    

    D - Snuke Prime

    时间复杂度:(mathcal{O}(N))

    using ll = long long;
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        ll N, C;
        cin >> N >> C;
        vector<pair<ll, ll>> event;
        for (ll i = 0; i < N; ++i) {
            ll a, b, c;
            cin >> a >> b >> c;
            event.push_back({a - 1, c});
            event.push_back({b, -c});
        }
        sort(event.begin(), event.end());
        ll ans = 0, fee = 0, time = 0;
        for (auto [x, y] : event) {
            if (x != time) {
                ans += min(C, fee) * (x - time);
                time = x;
            }
            fee += y;
        }
        cout << ans << "
    ";
        return 0;
    }
    

    E - Peddler

    题意:N 个城镇,每个镇子购买和卖出 (1kg) 黄金的价格是 (A_i) ,现在可以我们有 M条道路,问怎么才能获得最大收益

    思路:虽然看过去需要搜索做,但这里只要逆向动态规划即可。

    int main() {
        ios_base::sync_with_stdio(false), cin.tie(0);
        int N, M;
        cin >> N >> M;
        vector<int> A(N + 1);
        for (int i = 1; i <= N; ++i) cin >> A[i];
    
        vector<vector<int>> e(N + 1);
        for (int i = 0; i < M; ++i) {
            int u, v;
            cin >> u >> v;
            // e[u].emplace_back(v), e[v].emplace_back(u);
            e[u].emplace_back(v);  // 这里单向和双向都没什么区别
        }
    
        vector<int> h(N + 1, -1e9);
        int ans = -1e9;
        for (int i = N; i > 0; --i) {
            for (auto v : e[i]) h[i] = max(h[i], h[v]);
            ans = max(ans, h[i] - A[i]);
            h[i] = max(h[i], A[i]);
        }
        cout << ans << "
    ";
        return 0;
    }
    

    F - +1-1x2

    • 如果 (X ge Y) ,则答案为(X - Y)
    • 如果 (X < Y) ,则可以考虑用DFS,详细可以看代码
    using ll = long long;
    ll x, y, ans = 1e18;
    map<ll, ll> mp;
    ll dfs(ll a) {
        if (mp.count(a)) return mp[a];
        if (a <= x) return x - a;
        if (a & 1)
            return mp[a] = min(min(dfs((a + 1) / 2), dfs((a - 1) / 2)) + 2, a - x);
        else
            return mp[a] = min(dfs(a / 2) + 1, a - x);
    }
    int main() {
        cin >> x >> y;
        cout << dfs(y);
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    HBase分布式集群搭建过程
    HBase基础知识
    HBase伪分布搭建
    搭建ZooKeeper集群环境
    hadoop集群环境搭建-hadoop之伪分布搭建环境
    乱序数组找出前面的都比他小后面的都比他大的数
    sikuli简介
    ZooKeeper 应用场景
    svmrank原理
    Latex汇总
  • 原文地址:https://www.cnblogs.com/RioTian/p/14571195.html
Copyright © 2011-2022 走看看