首页 > 编程语言 >C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛

C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛

时间:2023-09-06 19:13:36浏览次数:45  
标签:02 周赛 dist idx int C++ st include AcWing

AcWing 第2场周赛

竞赛 - AcWing

3626 三元一次方程

AcWing 3626. 三元一次方程 - AcWing

image-20230906152907705

两层循环

#include <iostream>

using namespace std;

void find(int n) {
    for (int x = 0; x <= 1000 / 3; x++) {
        for (int y = 0; y <= 1000 / 5; y++) {
            int res = n - 3 * x - 5 * y;
            if (res < 0) {
                continue;
            } else if (res % 7 == 0) {
                cout << x << " " << y << " " << res / 7 << endl;
                return;
            }
        }
    }
    cout << "-1" << endl;
}

int main() {
    int m;
    cin >> m;
    while (m--) {
        int n;
        cin >> n;
        if (n < 0) {
            cout << "-1" << endl;
            continue;
        }
        find(n);
    }
}

3627⭐最大差值

3627. 最大差值 - AcWing题库

image-20230906160257775

考查贪心,所有输入的不是0的数排序,每次操作取最大的数++,由于每个数最大可以是1e9,int可能溢出,需要用 long long

#include <algorithm>
#include <iostream>

using namespace std;

const int N = 2e5 + 10;

int t, n, k;
int a[N];
int main() {
    cin >> t;
    while (t--) {
        cin >> n >> k;
        int idx = 0;
        for (int i = 0; i < n; i++) {
            int x;
            scanf("%d", &x);
            if (x != 0) a[idx++] = x;
        }
        sort(a, a + idx);
        long long res = a[--idx];
        int i = idx - 1;
        while (k--)
            if (i >= 0) res += a[i--];
        cout << res << endl;
    }
}

3628⭐⭐边的删减

3628. 边的删减 - AcWing题库

image-20230906164624612

刚开始有点傻,打算用克鲁斯卡尔生成最小生成树,题意明显不是这样的

  • 最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径
  • 最短路径是从一点出发,到达目的地的路径最小。

所以本题的解题思路先用堆优化版迪杰斯特拉求各点到根节点的最短路径,然后用DFS从根节点找k条边的连通图(任意一个包含k条边的连通块就是答案)

因为 w <= 1e9,所以dist数组长度要用 long long 存

考查堆优化Dijkstra、DFS

#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<LL, int> PII;
const int N = 10e5 + 10, M = 2 * N;
int n, m, k;
int h[N], e[M], ne[M], idx, w[M], id[M];
LL dist[N];
bool st[N];

void add(int a, int b, int c, int d) {
    e[idx] = b;
    w[idx] = c;
    id[idx] = d;
    ne[idx] = h[a];
    h[a] = idx++;
}

void dijkstra() {
    priority_queue<PII, vector<PII>, greater<PII>> heap;  // 定义为小根堆
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    heap.push({0, 1});
    while (heap.size()) {
        auto u = heap.top();
        heap.pop();
        if (st[u.y]) continue;
        st[u.y] = true;
        for (int i = h[u.y]; ~i; i = ne[i]) {
            int j = e[i];
            if (dist[j] > u.x + w[i]) {
                heap.push({u.x + w[i], j});
                dist[j] = u.x + w[i];
            }
        }
    }
}

vector<int> ans;
void dfs(int x) {
    st[x] = true;
    for (int i = h[x]; ~i; i = ne[i]) {
        int j = e[i];
        if (!st[j] && dist[x] + w[i] == dist[j]) {
            if (ans.size() < k) ans.push_back(id[i]);
            dfs(j);
        }
    }
}

int main() {
    cin >> n >> m >> k;
    memset(h, -1, sizeof h);
    for (int i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c, i);
        add(b, a, c, i);
    }
    dijkstra();
    memset(st, 0, sizeof st);
    dfs(1);
    cout << ans.size() << endl;
    for (auto i : ans) cout << i << " ";
    return 0;
}

img

标签:02,周赛,dist,idx,int,C++,st,include,AcWing
From: https://www.cnblogs.com/linxiaoxu/p/17683153.html

相关文章

  • 升哲科技城市级“算力+数字底座”服务亮相2023服贸会
    9月2日至6日,以“开放引领发展,合作共赢未来”为主题的2023年中国国际服务贸易交易会在北京隆重举办。作为城市级数据服务商,升哲科技(SENSORO)连续第四年参加服贸会,携城市级“算力+数字底座”服务及在城市治理领域的广泛应用成果亮相本届服贸会“北京市专精特新展区”,展现科技创新活力......
  • C++运算符优先级
    所有(可能)运算符共分为18级。第1级运算符含义::作用域解析运算符第2级运算符含义()函数调用()值构造,即type(expr)[]数组下标->间接成员运算符.直接成员运算符const_cast专用的类型转换dynamic_cast专用的类型转换re......
  • 2023 羊城杯 vm_wo
    2023羊城杯vm_wo详解 这是一道Vm的题,第一次做这种题总结下,VM框架大概就是VM框架中会模拟正常的CPU去读指令然后执行指令。然后会有1个全局变量然后会有一个dispatcher的程序模拟CPU读取指令,然后去执行函数,就可以做到和真实的程序一样 writeUP这道题的整体逻辑还......
  • c++中输出浮点数
    flata=1;flatb=3;cout<<a<endl;cout<<showpoint<<b<endl;ANSI C++里一个浮点型若是小数部分为0,直接输出必然是不带小数点的,例如floatb=3;你若想输出3.0,输出代码要这样写:cout << showpoint << a;......
  • 词句积累(2023)
    《增广贤文》是一部蕴含中国古代智慧和人生哲理的著作,主要讲述了人及人际关系、命运、处世、对读书的看法等方面。它强调了人的一切都是命运安排的,人应行善,才会有好的际遇。“卧久者行必远,伏久者飞必高”出自明·还初道人《菜根谭》。“已识乾坤大,犹怜草木青”出自马一浮《旷怡......
  • 【2023-09-04】周末意图
    20:00你要记住,尽量成为好人是你的职责所在,无论人的本性有着什么样的要求,做事时不要抱逃避态度;言谈要尽量恰当贴切,只是做到好的气质与温和谦逊即可,切莫虚伪。                                     ......
  • 【2023-09-05】熵减面目
    20:00当生气时,我们会倾向相信愤怒是由别人所造成的,而将所受的痛苦都责怪到别人身上。但是如果深入地观察就会明了,造成痛苦的主因,其实是内心那颗愤怒的种子。                                     ......
  • Gym102354I From Modular to Rational
    问两个相乘不会炸\(\rmlong\long\)的质数,用CRT合并,得到\(\frac{p}{q}\equivr\\pmodM\)。其中\(M\)是大于\(10^{18}\)的数。由于这个\(M\)太大了,不存在\(\frac{p}{q}\equiv\frac{a}{b}\pmodM\)且\(p,q,a,b\leq10^9\),所以我们只需找到一个\(\frac{p}{......
  • C++中的虚函数重载
    在一次修改代码过程中踩的坑,下来研究了一下,发现C++中虚函数重载后会产生很多有意思的情况,在这里总结了一下。C++中有重载(overload)和重写(override)以及重定义这几个概念,1overload:指的是相同作用域中的两个函数的函数名相同,但参数列表的个数、顺序、类型不同。而override指的是子类......
  • ICML 2023 | 神经网络大还是小?Transformer模型规模对训练目标的影响
    前言 本文研究了Transformer类模型结构(configration)设计(即模型深度和宽度)与训练目标之间的关系。结论是:token级的训练目标(如maskedtokenprediction)相对更适合扩展更深层的模型,而sequence级的训练目标(如语句分类)则相对不适合训练深层神经网络,在训练时会遇到over-smoothin......