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;
}