Cod sursa(job #2142947)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 25 februarie 2018 13:54:46
Problema Aprindere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.35 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;
}

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 << "    " << localizareIntrerupatoare[i].nrIntrerupatoareBune;
		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;
			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++;
					}
				}
			}
		}

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


	

	// 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;
}