Concours AtCoder Débutant 443

Approche : Simulation directe de la logique.

Code AC :

void solution() {
    string chaine;
    int compteur = 0;
    cin >> chaine;
    for (char c : chaine) {
        if (c == 'i' || c == 'j') {
            compteur++;
        }
    }
    cout << compteur << endl;
}

Problème B - Joueur de Musique

Approche : Simulation des opérations d'achat, de vente et de verrouillage.

Code AC :

void solution() {
    int nombre;
    bool morceau;
    cin >> nombre;
    for (int i = 1; i <= nombre; i++) {
        string operation;
        cin >> operation;
        if (operation == "1") {
            nombre++;
        } else if (operation == "2") {
            if (nombre >= 1) {
                nombre--;
            }
        } else {
            morceau = !morceau;
        }
        if (nombre >= 3 && morceau) {
            cout << "Oui" << endl;
        } else {
            cout << "Non" << endl;
        }
    }
}

Problème C - Revue Par Pairs

Approche : Calcul de combinaisons basé sur le nombre de reviewers disponibles.

Code AC :

void solution() {
    int personnes, domaines;
    cin >> personnes >> domaines;
    map<int int=""> capacite;
    for (int i = 1; i <= personnes; i++) {
        capacite[i] = personnes - 1;
    }
    for (int i = 1; i <= domaines; i++) {
        int a, b;
        cin >> a >> b;
        capacite[a]--;
        capacite[b]--;
    }
    for (int i = 1; i <= personnes; i++) {
        int x = capacite[i];
        if (x < 3) {
            cout << 0 << " ";
        } else {
            cout << (x * (x - 1) * (x - 2)) / 6 << " ";
        }
    }
    cout << endl;
}</int>

Problème D - Echange et Sommes de Plages

Approche : Utilisation de sommes cumulatives pour gérer les modifications rapides.

Code AC :

void solution() {
    vector<long long=""> prefix;
    vector<int> tab;
    cin >> tab.size() + 1 >> tab[0];
    prefix.reserve(tab.size() + 1);
    prefix[0] = 0;
    for (int i = 1; i <= tab.size(); i++) {
        prefix[i] = prefix[i - 1] + tab[i];
    }
    int operations;
    cin >> operations;
    while (operations--) {
        string action;
        cin >> action;
        if (action == "mise_a_jour") {
            int indice;
            cin >> indice;
            prefix[indice] = prefix[indice] - tab[indice] + tab[indice + 1];
            swap(tab[indice], tab[indice + 1]);
        } else {
            int debut, fin;
            cin >> debut >> fin;
            cout << prefix(fin) - prefix(debut - 1) << endl;
        }
    }
}</int></long>

Problème E - Laser de Takahashi

Approche : Tri par comparateur basé sur la polarité et le rangement.

Code AC :

struct Point {
    int x;
    int y;
};

bool comparateur(const Point& a, const Point& b) {
    int hauteurA = (a.y < 0) || ((a.y == 0) && (a.x > 0));
    int hauteurB = (b.y < 0) || ((b.y == 0) && (b.x > 0));
    if (hauteurA != hauteurB) {
        return hauteurA > hauteurB;
    } else {
        return (a.y * b.x) > (b.y * a.x);
    }
}

void solution() {
    int nb_points, requetes;
    cin >> nb_points >> requetes;
    vector<point> points(nb_points + 1);
    for (int i = 1; i <= nb_points; i++) {
        cin >> points[i].x >> points[i].y;
    }
    vector<int> indice(nb_points + 1);
    iota(indice.begin(), indice.end(), 0);
    sort(indice.begin() + 1, indice.end(), [&points](int i, int j) {
        return comparateur(points[i], points[j]);
    });
    vector<int> rev(nb_points + 1);
    for (int i = 1; i <= nb_points; i++) {
        rev[indice[i]] = i;
    }
    vector<int> gauche(nb_points + 1), droite(nb_points + 1);
    gauche[1] = 1;
    for (int i = 2; i <= nb_points; i++) {
        if (comparateur(points[indice[i - 1]], points[indice[i]])) {
            gauche[i] = i;
        } else {
            gauche[i] = gauche[i - 1];
        }
    }
    droite[nb_points] = nb_points;
    for (int i = nb_points - 1; i >= 1; i--) {
        if (comparateur(points[indice[i]], points[indice[i + 1]])) {
            droite[i] = i;
        } else {
            droite[i] = droite[i + 1];
        }
    }
    while (requetes--) {
        int a, b;
        cin >> a >> b;
        int i = rev[a];
        int j = rev[b];
        if (gauche[j] <= i && i <= droite[j]) {
            cout << j - i + 1 << endl;
        } else {
            cout << nb_points - i + j + 1 << endl;
        }
    }
}</int></int></int></point>

Problème F - Séparation Diagonale 2

Approche : Utilisation de la programmation dynamique pour minimiser les opérations tout en respectant les contraintes de déplacement.

Code AC :

struct Etat {
    int ligne;
    int blancs;
    int cout;
};

void solution() {
    vector<vector>> dp(201, vector<int>(201, INT_MAX));
    for (int j = 1; j <= 200; j++) {
        dp[1][j] = j;
    }
    for (int i = 2; i <= 200; i++) {
        int min_prev = INT_MAX;
        for (int j = 200; j >= 1; j--) {
            min_prev = min(min_prev, dp[i - 1][j]);
            dp[i][j] = min_prev + j - prefix[i][j] + suffix[i][j + 1];
        }
    }
    cout << dp[n][m] << endl;
}</int></vector>

Étiquettes: atcoder C++ algorithmes programmation concours optimisations

Publié le 27 août à 13h25