Cod sursa(job #2142525)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 25 februarie 2018 11:06:25
Problema Aprindere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>
using namespace std;
 
ifstream in("aprindere.in");
ofstream out("aprindere.out");

// pair< int, int > camera are first = nr camerei si second starea ei

struct intrerupatoare {
	int nrCamera;
	int timpActionare;
	int nrIntrerupatoare;
	vector< int > localizare;
};

int cmpSort(const intrerupatoare &a, const intrerupatoare &b) {
	if(a.nrIntrerupatoare == b.nrIntrerupatoare) {
		if(a.timpActionare == b.timpActionare) {
			return a.nrCamera < b.nrCamera;
		} else {
			return a.timpActionare < b.timpActionare;
		}
	}
	return a.nrIntrerupatoare > b.nrIntrerupatoare;
}

void Tiparire(const vector< intrerupatoare > &localizareIntrerupatoare, int m) {
	for(int i = 0; i < m; ++i) {
		out << localizareIntrerupatoare[i].nrCamera << " " << localizareIntrerupatoare[i].timpActionare << " " << localizareIntrerupatoare[i].nrIntrerupatoare << " ";
		for(int j = 0; j < localizareIntrerupatoare[i].nrIntrerupatoare; ++j) {
			out << localizareIntrerupatoare[i].localizare[j] << " ";
		}
		out << '\n';
	}
}

int main() {

	int n, m; in >> n >> m;

	vector< int > camere(n);
	for(auto& it: camere) in >> it;
	
	vector< intrerupatoare > localizareIntrerupatoare(m);
	for(int i = 0; i < m; ++i) {
		in >> localizareIntrerupatoare[i].nrCamera >> localizareIntrerupatoare[i].timpActionare >> localizareIntrerupatoare[i].nrIntrerupatoare;
		for(int j = 0; j < localizareIntrerupatoare[i].nrIntrerupatoare; ++j) {
			int x; in >> x;
			localizareIntrerupatoare[i].localizare.push_back(x);
		}
	}

	sort(localizareIntrerupatoare.begin(), localizareIntrerupatoare.end(), cmpSort);

	//Tiparire(localizareIntrerupatoare, m); out << "\n\n";

	int ans = 0;
	for(int i = 0; i < m; ++i) {
		bool ok = false;
		for(int j = 0; j < localizareIntrerupatoare[i].nrIntrerupatoare; ++j) {
			if(camere[localizareIntrerupatoare[i].localizare[j]] == 0)
				ok = true;
		}

		if(ok == true) {
			for(int j = 0; j < localizareIntrerupatoare[i].nrIntrerupatoare; ++j) {
				if(camere[localizareIntrerupatoare[i].localizare[j]] == 0)
					camere[localizareIntrerupatoare[i].localizare[j]] = 1;
				else
					camere[localizareIntrerupatoare[i].localizare[j]] = 0;
			}

			ans += localizareIntrerupatoare[i].timpActionare;
		}
	}

	out << ans << '\n';
 
    in.close(); out.close();
 
    return 0;
}