【Atcoder训练记录】AtCoder Beginner Contest 373

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;
}
posted @ 2024-09-28 21:41  MNNUACM_2024ZY  阅读(206)  评论(1编辑  收藏  举报