AtCoder Beginner Contest 188 题解

AtCoder Beginner Contest 188

A,B很简单就不多说

C - ABC Tournament

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

时间复杂度:O(2N)

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) << "\n";
    return 0;
}

D - Snuke Prime

时间复杂度: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 << "\n";
    return 0;
}

E - Peddler

题意:N 个城镇,每个镇子购买和卖出 1kg 黄金的价格是 Ai ,现在可以我们有 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 << "\n";
    return 0;
}

F - +1-1x2

  • 如果 XY ,则答案为XY
  • 如果 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);
}
posted @   RioTian  阅读(93)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
历史上的今天:
2020-03-23 2020年蓝桥杯校内模拟赛题解
点击右上角即可分享
微信分享提示

📖目录