Cod sursa(job #2430815)

Utilizator mirceatlxhaha haha mirceatlx Data 16 iunie 2019 16:43:40
Problema Aprindere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("aprindere.in");
ofstream fout("aprindere.out");
int N,M;
int f[1005];

struct switcher
{
    int ss;
    int time;
    int nr;
    int v[1005];
    int need = 0;
};

switcher vec[1005];

void Read()
{
    fin>>N>>M;
    for(int i = 0;i<N;i++)
        fin>>f[i];
    for(int i = 1;i<=M;i++)
    {
        fin>>vec[i].ss>>vec[i].time>>vec[i].nr;
        for(int j = 1;j<=vec[i].nr;j++)
        {
            fin>>vec[i].v[j];
            if(f[vec[i].v[j]] == 0)
                vec[i].need++;
        }

    }

}

bool CMP(switcher a,switcher b)
{
    if(a.need == b.need)
        return a.time > b.time;
    return a.need > b.need;
}

bool cmp(int i)
{
     for(int j =1;j<=vec[i].nr;j++)
        if(f[vec[i].v[j]] == 0)
            return 1;
    return 0;
}
int main()
{
    long long sum = 0;
    Read();

    /*for(int i =1;i<=M;i++)
        fout<<vec[i].ss<<" "<<vec[i].need<<"\n";*/
    int dark = 0;
    for(int i = 0;i<N;i++)
        if(f[i]==0)
        dark++;
    while(dark)
    {
        sort(vec+1,vec+M+1,CMP);

        for(int i = 1;i<=M;i++)
        {
           if(cmp(i))
           {
               for(int j=1;j<=vec[i].nr;j++)
                if(f[vec[i].v[j]] == 1)
            {
                f[vec[i].v[j]] = 0;
                dark++;
                vec[i].need++;
            }
            else
                {
                    f[vec[i].v[j]] = 1;
                    dark--;
                    vec[i].need--;
                }
            sum = sum +vec[i].time;
           }



        }
    }
    fout<<sum<<"\n";
    return 0;
}