ICode9

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

AcWing第11场周赛题解

2022-04-10 08:32:03  阅读:154  来源: 互联网

标签:11 周赛 int 题解 cin que mp maxn dis


A. 3795. 计算abc

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

题目大意:已知三个正整数 \(a \le b \le c\),告诉你 \(a+b,a+c,b+c,a+b+c\),分别求 \(a,b,c\)。

解题思路:比较简单所以直接看代码吧。

示例程序:

#include <bits/stdc++.h>
using namespace std;
int a[4];

int main() {
    for (int i = 0; i < 4; i++) cin >> a[i];
    sort(a, a+4);
    for (int i = 2; i >= 0; i--)
        cout << a[3] - a[i] << " ";
    return 0;
}

B. 3796. 凑平方

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

题目大意:问最少删几位能变成一个平方数(正整数)。

解题思路:把情况都枚举出来。以搜索的形式。我这里用 bfs 解决。

示例程序:

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

int T, n;
map<int, int> mp;
queue<int> que;

bool check(int a) {
    int b = sqrt(a);
    return b * b == a;
}

int solve(int n) {
    if (check(n)) return 0;
    mp.clear();
    while (!que.empty()) que.pop();
    que.push(n);
    mp[n] = 0;
    while (!que.empty()) {
        int u = que.front();
        if (check(u)) return mp[u];
        que.pop();
        int t = 1;
        for (long long t = 1; t <= u; t *= 10) {
            int v = u / (t*10) * t + u % t;
            if (v == 0) continue;
            if (t > 1 && u / t < 10 && u / (t/10) % 10 == 0) continue;  // 次高位为0时不能删掉最高位
            if (mp.find(v) == mp.end()) {
                mp[v] = mp[u] + 1;
                que.push(v);
            }
        }
    }
    return -1;
}

int main() {
    cin >> T;
    while (T--) {
        cin >> n;
        cout << solve(n) << endl;
    }
    return 0;
}

C. 3797. 最大化最短路

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

题目大意:

解题思路:

以节点 \(1\) 和 \(n\) 为起点求两次最短路(通过bfs即可)可以求出所有节点 \(i\) 距离节点 \(1\) 的最短路径长度(记为 \(dis_{1,i}\)),以及所有节点 \(i\) 距离节点 \(n\) 的最短路径长度(记为 \(dis_{2,i}\))。

则问题变成了对于所有特殊点对 \(x,y\) ,求 \(\min\{ dis_{1,i} + dis_{2,j}, dis_{1,j} + dis_{2, i} \} + 1\) 的最大值问题了。

而对这个问题的分析思路完全来自 题解视频,相当神奇!!

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, m, k, a[maxn], dis1[maxn], dis2[maxn], p[maxn];

bool cmp(int i, int j) {
    return dis1[i] - dis2[i] < dis1[j] - dis2[j];
}

vector<int> g[maxn];
queue<int> que;
void bfs(int s, int dis[]) {
    memset(dis, -1, sizeof(int)*(n+1));
    while (!que.empty()) que.pop();
    dis[s] = 0;
    que.push(s);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        for (auto v : g[u]) {
            if (dis[v] == -1) {
                dis[v] = dis[u] + 1;
                que.push(v);
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> m >> k;
    for (int i = 0; i < k; i ++) cin >> a[i];
    while (m--) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    bfs(1, dis1);
    bfs(n, dis2);
    sort(a, a+k, cmp);
    int ans = 0, mx = 0;
    for (int i = 0; i < k; i++) {
        if (i) ans = max(ans, mx + dis2[a[i]]);
        mx = max(mx, dis1[a[i]]);
    }
    cout << min(dis1[n], ans+1) << endl;
    return 0;
}

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

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

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

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

ICode9版权所有