ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing第8场周赛题解

2022-04-09 02:31:27  阅读:182  来源: 互联网

标签:周赛 int 题解 cin ++ maxn que AcWing dis


A. 3770. 最小消耗

题目链接:https://www.acwing.com/problem/content/description/3773/

题目大意:按照题目要求消灭两种类型怪兽(可以消耗 c 转换)的最小消耗。

解题思路:循环记录 0 和 1 出现的次数,消灭一个 0 的最小消耗为 min(a, b+c),消灭一个 1 的最小消耗为 min(a+c, b)

示例程序:

#include <bits/stdc++.h>
using namespace std;

int T, n, a, b, c, c0, c1;
char s[1010];

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> a >> b >> c >> s;
        c0 = c1 = 0;
        for (int i = 0; i < n; i++)
            (s[i] == '0') ? c0++ : c1++;
        cout << c0 * min(a, b+c) + c1 * min(a+c, b) << endl;
    }
    return 0;
}

B. AcWing 3771. 选取石子

题目链接:https://www.acwing.com/problem/content/3774/

题目大意:从数列里面选出一些数满足 \(a_i - a_j = i - j\)。

解题思路:将所有 \(a_i\) 放入 \(a_i - i\) 的桶中(实际实现时用的 map),找最大的那个桶。

示例程序:

#include <bits/stdc++.h>
using namespace std;

map<int, long long> mp;
int n, a;
long long ans;

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a;
        mp[a-i] += a;
    }
    for (auto p : mp)
        ans = max(ans, p.second);
    cout << ans << endl;
    return 0;
}

C. 3772. 更新线路

题目链接:https://www.acwing.com/problem/content/3775/

题目大意:求一条路径走过来最短路最少和最多更新次数。

解题思路:返图+最短路+最短路计数。最少更新次数是不是最短路径的点,最多更新次数是:不是最短路径的点+最短路径不唯一的点。由于边权为 \(1\),所以可以 bfs 求最短路。注意:强连通图的条件很重要,这能保证反图也强连通。

最主要的逻辑在第 40 ~ 42 行。请认真体会(调了好长时间)

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, m, k, p[maxn], dis[maxn], cnt[maxn], pre[maxn];
vector<int> g[maxn];
queue<int> que;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    while (m--) {
        int u, v;
        cin >> u >> v;
        g[v].push_back(u); // 建反图
    }
    cin >> k;
    for (int i = 1; i <= k; i++) cin >> p[i];
    memset(dis, -1, sizeof(int)*(n+1));
    dis[p[k]] = 0;
    cnt[p[k]] = 1;
    que.push(p[k]);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        for (auto v : g[u]) {
            if (dis[v] == -1) {
                dis[v] = dis[u] + 1;
                cnt[v] = 1;
                pre[v] = u;
                que.push(v);
            }
            else if (dis[v] == dis[u] + 1)
                cnt[v]++;
        }
    }
    int c1 = 0, c2 = 0;
    for (int i = 1; i <= k; i++) {
        int u = p[i];
        if (i < k && cnt[u]==1 && pre[u] == p[i+1]) continue; // 新增条件:非最短路但是不唯一也不更新
        if (i < k && dis[u] != dis[p[i+1]] + 1) c1++;
        if (cnt[u] > 1 || i < k && pre[u] != p[i+1]) c2++;
    }
    cout << c1 << " " << c2 << endl;
    return 0;
}

标签:周赛,int,题解,cin,++,maxn,que,AcWing,dis
来源: https://www.cnblogs.com/quanjun/p/16120679.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有