Pagini recente » Cod sursa (job #1522979) | Cod sursa (job #1254995) | Cod sursa (job #974703) | Cod sursa (job #1563446) | Cod sursa (job #2142947)
#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;
}