0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ABC373】AtCoder Beginner Contest 373【C++】

Posted at

コンテスト名

AtCoder Beginner Contest 373

コンテストURL

開催日

2024/09/28 21:00-22:40


A: September

解法

  • 順番に判定する
ABC373A.cpp
#include <iostream>
#include <string>
using namespace std;

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

    return 0;
}

B: 1D Keyboard

解法

  • map<char, int> で各文字の位置を記録してシミュレーションする
ABC373B.cpp
#include <iostream>
#include <string>
#include <map>
#include <cmath>
using namespace std;

int main(){
    string s;
    cin >> s;

    map<char, int> M;
    for(int i=0; i<s.size(); i++){
        M[s[i]] = i;
    }

    int sum = 0;
    for(int i=0; i<s.size()-1; i++){
        sum += abs(M['A'+i+1]-M['A'+i]);
    }

    cout << sum << endl;

    return 0;
}

C: Max Ai+Bj

解法

  • $A$ の最大値と $B$ の最大値をそれぞれ求める
ABC373C.cpp
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;

    int maxa = -1e9, maxb = -1e9;
    int a, b;
    for(int i=0; i<n; i++){
        cin >> a;
        maxa = max(maxa, a);
    }
    for(int i=0; i<n; i++){
        cin >> b;
        maxb = max(maxb, b);
    }

    cout << maxa + maxb << endl;

    return 0;
}

D: Hidden Weights

解法

  1. 幅優先探索 (BFS)
  2. 深さ優先探索 (DFS)
  • 与えられた有向辺と逆向きに重み $-w$ の辺を追加する
ABC373D_1.cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;

    vector<vector<pair<int, int>>> G(n);
    int u, v, w;
    for(int i=0; i<m; i++){
        cin >> u >> v >> w;
        u--;
        v--;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, -w);
    }

    vector<long long int> X(n);
    vector<int> seen(n, -1);
    queue<int> Q;

    for(int i=0; i<n; i++){
        if(seen[i]!=-1){
            continue;
        }

        X[i] = 0;
        seen[i] = 1;
        Q.push(i);
        while(!Q.empty()){
            int now = Q.front();
            Q.pop();

            for(int j=0; j<G[now].size(); j++){
                auto [next, w] = G[now][j];
                if(seen[next]!=-1){
                    continue;
                }
                X[next] = X[now] + w;
                seen[next] = 1;
                Q.push(next);
            }
        }
    }

    for(int i=0; i<n; i++){
        if(i){
            cout << " ";
        }
        cout << X[i];
    }
    cout << endl;

    return 0;
}
ABC373D_2.cpp
#include <iostream>
#include <vector>
using namespace std;

vector<vector<pair<int, int>>> G;
vector<long long int> X;
vector<int> seen;

void dfs(int v, long long int w){
    seen[v] = 1;
    X[v] = w;

    for(int i=0; i<G[v].size(); i++){
        auto [next, weight] = G[v][i];
        if(seen[next]!=-1){
            continue;
        }
        dfs(next, X[v]+weight);
    }
}

int main(){
    int n, m;
    cin >> n >> m;

    G.resize(n);
    int u, v, w;
    for(int i=0; i<m; i++){
        cin >> u >> v >> w;
        u--;
        v--;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, -w);
    }

    X.resize(n);
    seen.assign(n, -1);

    for(int i=0; i<n; i++){
        if(seen[i]!=-1){
            continue;
        }
        dfs(i, 0);
    }

    for(int i=0; i<n; i++){
        if(i){
            cout << " ";
        }
        cout << X[i];
    }
    cout << endl;

    return 0;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?