Cod sursa(job #2142954)

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

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

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

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;
			if(camere[x] == 0)
				localizareIntrerupatoare[i].nrIntrerupatoareBune++;

			localizareIntrerupatoare[i].localizare.push_back(x);
		}
	}

	int ans = 0;

	while(find(camere.begin(), camere.end(), 0) != camere.end()) {
		sort(localizareIntrerupatoare.begin(), localizareIntrerupatoare.end(), cmpSort);

		ans += localizareIntrerupatoare[0].timpActionare;
		localizareIntrerupatoare[0].nrIntrerupatoareBune = localizareIntrerupatoare[0].nrIntrerupatoare - localizareIntrerupatoare[0].nrIntrerupatoare; 

		for(int i = 0; i < localizareIntrerupatoare[0].nrIntrerupatoare; ++i) {
			camere[localizareIntrerupatoare[0].localizare[i]] = !camere[localizareIntrerupatoare[0].localizare[i]];
			for(int j = 1; j < m; ++j) {
				for(int k = 0; k < localizareIntrerupatoare[j].nrIntrerupatoare; ++k) {
					if(localizareIntrerupatoare[j].localizare[k] == localizareIntrerupatoare[0].localizare[i]) {
						if(camere[localizareIntrerupatoare[0].localizare[i]] == 1)
							localizareIntrerupatoare[j].nrIntrerupatoareBune--;
						else
							localizareIntrerupatoare[j].nrIntrerupatoareBune++;
					}
				}
			}
		}
	}

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