Cod sursa(job #3331006)

Utilizator densisGeanta Denis densis Data 23 decembrie 2025 17:25:58
Problema Aprindere Scor 20
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;

struct Intrerupator {
    int poz;        // camera unde este întrerupătorul
    int timp;       // timpul de apăsare
    int nr;         // câte camere modifică
    int c[105];     // camerele afectate
};

int main() {
    ifstream fin("aprindere.in");
    ofstream fout("aprindere.out");

    int n, m;
    fin >> n >> m;

    int a[105]; // starea becurilor
    for (int i = 0; i < n; i++)
        fin >> a[i];

    Intrerupator sw[105];

    for (int i = 0; i < m; i++) {
        fin >> sw[i].poz >> sw[i].timp >> sw[i].nr;
        for (int j = 0; j < sw[i].nr; j++)
            fin >> sw[i].c[j];
    }

    int sum = 0;

    // parcurgem camerele în ordine
    for (int i = 0; i < n; i++) {

        // dacă becul e aprins, nu trebuie să facem nimic
        if (a[i] == 1)
            continue;

        // căutăm cel mai ieftin întrerupător din camera i
        int best = -1;
        int bestT = 1e9;

        for (int k = 0; k < m; k++) {
            if (sw[k].poz == i && sw[k].timp < bestT) {
                bestT = sw[k].timp;
                best = k;
            }
        }

        // dacă nu există întrerupător în camera i → imposibil
        if (best == -1) {
            fout << -1;
            return 0;
        }

        // apăsăm întrerupătorul ales
        sum += sw[best].timp;

        // toggle pe camerele afectate
        for (int j = 0; j < sw[best].nr; j++) {
            int cam = sw[best].c[j];
            a[cam] = 1 - a[cam];
        }
    }

    fout << sum;
    return 0;
}