Cod sursa(job #1808691)

Utilizator maria15Maria Dinca maria15 Data 17 noiembrie 2016 23:25:22
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>

using namespace std;

int n, i, j, x, q[16], m, v[16], s[16], f[33000], sol=35000, lung[33000], a, sum, u[23], da;
short int tip[16];

ifstream fin("reteta.in");
ofstream fout("reteta.out");

int nr(int k){
    int sol=0;
    while(k>0){
        sol+=(1<<k);
        k--;
    }
    return sol;
}

int compar(int a, int b){
    int x=max(lung[a], lung[b]);
    if((a|b)==nr(x) && ((a&b)==0))
        return 1;
    return 0;
}

int pret(int i){       // i = CONFIGURATIE de reteta
    int x=0;
    for(int j=19;j>=0;j--)
        if((i>>j) & 1) // daca medicamentul j este in CONFIGURATIA retetei, atunci
            x+=u[j-1];   // la pretul retetei adaug pretul medicamentului j
    return x;
}

int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>tip[i]>>q[i];
        for(j=0;j<q[i];j++){
            fin>>x;
            v[i]+=(1<<x); // v[i]= configuratia retetei i
        }
    }
    for(i=0;i<n;i++)
        fin>>u[i];
    for(i=1;i<=m;i++){
        s[i]=pret(v[i]);
        if(tip[i]==2)
            s[i]/=2;
    }
    while(f[0]==0){
        i=m;
        while(f[i]==1){
            f[i]=0;
            i--;
        }
        f[i]=1;
        a=0, sum=0;
        char ok=0;
        lung[a]=1;
        for(i=1;i<=m;i++)
             if(f[i]==1){
                if(compar(v[i], a)==1){
                   a|=v[i];
                   sum+=s[i];
                   lung[a]=max(lung[a], q[i]);
                }
                else{
                    ok=1;
                    break;
                }
             }
        if(a==nr(lung[a]) && sum<sol && ok==0 )
            sol=sum;
    }
    fout<<sol;
    return 0;
}