Cod sursa(job #3278456)

Utilizator gabrielrusu2712Rusu Gabriel Eduard gabrielrusu2712 Data 19 februarie 2025 21:20:50
Problema Aprindere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream input("aprindere.in");
ifstream output("aprindere.out");

int N, M, T=0; //nr camere, nr intrerupatoare, t minim;

struct intrerupator {
    int camera, timp, nrBecuri;
    vector<int> camereAfectate;

    intrerupator (int c, int t, int n) {
        camera = c;
        timp = t;
        nrBecuri = n;
        for (int i = 1; i <= n; i++) {
            int x;
            input >> x;
            camereAfectate.push_back(x);
        }
    }

    void afiseaza () {
        cout << camera << " " << timp << " " << nrBecuri << " ";
        for (int i = 0; i < nrBecuri; i++) {
            cout << camereAfectate.at(i) << " ";
        }
    }
};

struct camera {
    intrerupator intr = intrerupator(-1, 0, 0);
    bool aprinsa;
    camera (bool a) {
        aprinsa = a;
    }
    void adgIntrerupator (intrerupator i) {
        intr = i;
    }
    bool areIntrerupator () {
        return intr.camera == -1 ? false : true;
    }
};

vector<camera> camere;
vector<intrerupator> intr;

bool sortareCamereDupaNrDeCamereAfectate(camera A, camera B) {
    return A.intr.nrBecuri <= B.intr.nrBecuri;
}

void trigger (camera A) {
    if (A.areIntrerupator())
        for (int i = 0; i < A.intr.nrBecuri; i++) {
            camere.at(A.intr.camereAfectate.at(i)).aprinsa = !camere.at(A.intr.camereAfectate.at(i)).aprinsa;
        }
}

int main()
{
    input >> N >> M;
    for (int i = 1; i <= N; i++) {
        bool a;
        input >> a;
        camere.push_back(camera(a));
    }
    for (int i = 1; i <= M; i++) {
        int c, t, n;
        input >> c >> t >> n;
        intrerupator x = intrerupator(c, t, n);
        camere.at(c).adgIntrerupator(x);
        intr.push_back(x);
    }
    //sort(camere.begin(), camere.end(), sortareCamereDupaNrDeCamereAfectate);
    for (int i = 0; i < N; i++) {
        camera it = camere.at(i);
        if (!it.aprinsa && it.areIntrerupator()) {
            trigger(camere.at(i));
            T += camere.at(i).intr.timp;
        }
    }
    output << T;
    return 0;
}