Cod sursa(job #3136032)

Utilizator RobertCNMBrobertM RobertCNMB Data 5 iunie 2023 09:26:54
Problema Aprindere Scor 0
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <list>

using namespace std;
ifstream fin("aprindere.in");
ofstream fout("aprindere.out");

struct toggle {
    int time;
    int nr;
    int score;
    int bulbs[1000];
} aux;

int n, m, last, timer;
bool state[1000], done;
list<toggle> toggles;

int main(){
    fin >> n >> m;
    last = n;
    for (int i = 0; i < n; i++){
        fin >> state[i];
        if (state[i] == 0)
            done = false;
    }
    for (int i = 0; i < m; i++){
        fin.ignore(4, ' ');
        fin >> aux.time >> aux.nr;
        for (int j = 0; j < aux.nr; j++)
            fin >> aux.bulbs[j];
        toggles.push_back(aux);
    }

    while (! done){
        auto maxi = toggles.begin();
        for (auto i = toggles.begin(); i != toggles.end(); i++){
            if (i->bulbs[0] < last){
                i->score = 0;
                for (int j = 0; j < i->nr; j++)
                    if (state[i->bulbs[j]] == 0)
                        i->score++;
                    else i->score--;
            }

            if (maxi->score * i->time < i->score * maxi->time)
                maxi = i;
        }

        timer += maxi->time;

        for (int j = 0; j < maxi->nr; j++)
            state[maxi->bulbs[j]] ^= 1;

        last = maxi->bulbs[maxi->nr - 1];

        toggles.erase(maxi);

        done = true;
        for (int i = 0; i < n; i++)
            if (state[i] == 0)
                done = false;
    }

    fout << timer;
    return 0;
}