【Atcoder訓練記錄】AtCoder Beginner Contest 373

MNNUACM_2024ZY發表於2024-09-28

https://atcoder.jp/contests/abc373/tasks

賽後反思

B題第一次讀錯題意,浪費了幾分鐘,需加強審題能力

對於圖論有些生疏,D題為簡單圖論,在76min的時候才AC,需加強訓練圖論

A題

給定12個字串,求字串長度 \(= i\) 的個數,直接模擬

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int ans = 0;
	for(int i = 1;i<=12;i++){
		string s; cin>>s;
		if(s.size() == i) ans++;
	}	
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

B題

求移動的距離,直接從 A 到 Z 列舉即可,最開始是在 A 位置,開一個last記錄上一個的位置,每次答案加上距離差絕對值即可

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	string s; cin>>s;
	int ans = 0;
	map<char,int> a;
	for(int i = 0;i<s.size();i++){
		a[s[i]] = i;
	}
	int last = a['A'];
	for(int i = 'A';i<='Z';i++){
		ans += abs(a[i] - last);
		last = a[i];
	}
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

C題

要使答案最大,找 \({a_i},{b_i}\) 的最大值,求和即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	vector<int> a(n + 1);
	vector<int> b(n + 1);
	for(int i = 1;i<=n;i++) cin>>a[i];
	for(int i = 1;i<=n;i++) cin>>b[i];
	sort(a.begin() + 1,a.end());
	sort(b.begin() + 1,b.end());
	cout<<a[n]+b[n]<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

D題

我們發現建圖時 u->v +w 可以等效為 v->u -w,建雙向邊跑一次DFS更新答案即可

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 3;

int n,m;
int head[N];
int tot;
int ans[N];
bool vis[N];

struct node{
	int u,v,w,nxt;
}edge[N<<1];

void add_edge(int u,int v,int w){
	edge[++tot].u = u;
	edge[tot].v = v;
	edge[tot].w = w;
	edge[tot].nxt = head[u];
	head[u] = tot;
}

void dfs(int x,int fa){
	for(int i = head[x];i;i=edge[i].nxt){
		int u = edge[i].u;
		int v = edge[i].v;
		int w = edge[i].w;
		if(v == fa || vis[v]) continue;
		vis[u] = 1,vis[v] = 1;
		// cout<<ans[u]<<" "<<ans[v]<<" "<<w<<endl;
		ans[v] = ans[u] + w;
		dfs(v,u);
	}
}

void solve(){
	cin>>n>>m;
	for(int i = 1;i<=m;i++){
		int u,v,w; cin>>u>>v>>w;
		add_edge(u,v,w);
		add_edge(v,u,-w);
	}
	for(int i = 1;i<=n;i++){
		if(!vis[i])dfs(i,i);
	}
	for(int i = 1;i<=n;i++) cout<<ans[i]<<" ";
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

相關文章