日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Acwing第 2 场周赛【完结】

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Acwing第 2 场周赛【完结】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

做了兩道,看了一下第三道題目直接撤了,不過第三道題目好像之前在哪見過。
好像是個(gè)原題,不過還是不會(huì)。

目錄

  • A: 3626. 三元一次方程 【難度: 簡單 / 知識(shí)點(diǎn): 暴力】
  • B: 3627. 最大差值 【難度: 簡單 / 知識(shí)點(diǎn): 貪心】
  • C: 3628. 邊的刪減 【難度: 中等 / 知識(shí)點(diǎn): 最短路徑樹】

A: 3626. 三元一次方程 【難度: 簡單 / 知識(shí)點(diǎn): 暴力】


題目地址
這道題居然花費(fèi)了我十分鐘左右,題目數(shù)據(jù)范圍很小直接三重循環(huán)暴力就行。
剛開始想復(fù)雜了,花費(fèi)了不少時(shí)間,當(dāng)看到2分鐘就有人AC的時(shí)候,我知道了這絕對是一個(gè)簽到。
果斷轉(zhuǎn)換思維,打暴力。

#include<bits/stdc++.h> using namespace std; int main(void) {int t; cin>>t;while(t--){int n; cin>>n;bool flag=false;for(int i=0;i<=350;i++){for(int j=0;j<=200;j++){for(int z=0;z<=200;z++){if(i*3+j*5+z*7==n){cout<<i<<" "<<j<<" "<<z<<endl;flag=1;}if(flag) break;}if(flag) break;}if(flag) break;}if(!flag) cout<<-1<<endl;}return 0; }

B: 3627. 最大差值 【難度: 簡單 / 知識(shí)點(diǎn): 貪心】


題目地址

#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5*2+10; LL a[N]; int main(void) {int t; cin>>t;while(t--){int n,k; cin>>n>>k;LL sum=0;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);for(int i=n-k;i<=n;i++) sum+=a[i];cout<<sum<<endl;}return 0; }

C: 3628. 邊的刪減 【難度: 中等 / 知識(shí)點(diǎn): 最短路徑樹】


題目地址

在講解題目之前,需要直到的前置知識(shí):

  • 最短路徑的概念: 一個(gè)指定的頂點(diǎn)出發(fā),計(jì)算從該頂點(diǎn)出發(fā)到其他所有頂點(diǎn)的最短路徑。
  • 最小生成樹(Minimum Spanning Tree)簡稱MST: 有n個(gè)點(diǎn)我們選n-1條邊可以將所有的點(diǎn)聯(lián)通,且其權(quán)值之和最小。
  • 最短路徑樹(Shortest Path Tree)簡稱SPT: 是一種使用最短路徑算法生成的數(shù)據(jù)結(jié)構(gòu)樹。
    • 所謂最短路徑樹,就是對于給定的源點(diǎn) ,求出它到所有結(jié)點(diǎn)的最短路徑,并且通過前驅(qū)來標(biāo)記每個(gè)結(jié)點(diǎn)是從哪個(gè)結(jié)點(diǎn)過來的,如果有多 條長度相等的最短路徑時(shí),取其中一條,這樣整個(gè)圖就變成了一棵以源點(diǎn)為根結(jié)點(diǎn)的樹,這棵樹就叫最短路徑樹。
    • 需要注意的是,最短路徑樹是原圖的一棵生成樹,并且要求原圖一定是一個(gè)連通圖。

本題考察的知識(shí)點(diǎn)就是最短路經(jīng)樹,大致思路跑一遍的Dijkstra()求出來,各個(gè)點(diǎn)到1的最短距離。
遍歷一下圖,找到一個(gè)最多保留k條邊的最短路樹,那么我們的最優(yōu)狀態(tài)是k+1個(gè)點(diǎn)。
如果 dist[b]=dist[a]+w說明這是一條最短路上的邊。
y總代碼:

#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <vector>#define x first #define y secondusing namespace std;typedef long long LL; typedef pair<LL, int> PII;const int N = 100010, M = 200010;int n, m, k; int h[N], e[M], w[M], id[M], ne[M], idx; LL dist[N]; bool st[N]; vector<int> ans;void add(int a, int b, int c, int d) // 添加一條邊a->b,邊權(quán)為c {e[idx] = b, w[idx] = c, id[idx] = d, ne[idx] = h[a], h[a] = idx ++ ; }void dijkstra() // 求1號點(diǎn)到n號點(diǎn)的最短路距離 {memset(dist, 0x3f, sizeof dist);dist[1] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 1});while (heap.size()){auto t = heap.top();heap.pop();int ver = t.second, distance = t.first;if (st[ver]) continue;st[ver] = true;for (int i = h[ver]; i != -1; i = ne[i]){int j = e[i];if (dist[j] > dist[ver] + w[i]){dist[j] = dist[ver] + w[i];heap.push({dist[j], j});}}} }void dfs(int u) {st[u] = true;for (int i = h[u]; ~i; i = ne[i]){int j = e[i];if (!st[j] && dist[j] == dist[u] + w[i])//如果這是一條最短路徑上的邊{if (ans.size() < k) ans.push_back(id[i]);//加進(jìn)來dfs(j);}} }int main() {scanf("%d%d%d", &n, &m, &k);memset(h, -1, sizeof h);for (int i = 1; i <= m; i ++ ){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c, i), add(b, a, c, i);}dijkstra();memset(st, 0, sizeof st);dfs(1);printf("%d\n", ans.size());for (auto x: ans) printf("%d ", x);return 0; } #include<bits/stdc++.h> using namespace std; typedef long long int LL; typedef pair<LL, int> PII; const int N = 1e5+10,M=1e5*2+10; int h[N], e[M], w[M], ne[M],id[M],idx; LL dist[N]; bool st[N]; int n,m,k; vector<int> ans; void add(int a, int b, int c,int d) // 添加一條邊a->b,邊權(quán)為c {id[idx]=d,e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ; }void dijkstra() // 求1號點(diǎn)到n號點(diǎn)的最短路距離 {memset(dist, 0x3f, sizeof dist);dist[1] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 1});while (heap.size()){auto t = heap.top();heap.pop();int ver = t.second, distance = t.first;if (st[ver]) continue;st[ver] = true;for (int i = h[ver]; i != -1; i = ne[i]){int j = e[i];if (dist[j] > dist[ver] + w[i]){dist[j] = dist[ver] + w[i];heap.push({dist[j], j});}}} } void dfs(int u) {st[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]&&dist[j]==dist[u]+w[i]){if(ans.size()<k) ans.push_back(id[i]);dfs(j);}} } int main(void) {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(int i=0;i<ans.size();i++) cout<<ans[i]<<" "; }

總結(jié)

以上是生活随笔為你收集整理的Acwing第 2 场周赛【完结】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。