Cod sursa(job #1670737)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 31 martie 2016 23:13:04
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#define MAXN 20
#define DOIN 270000
FILE *f=fopen("zebughil.in","r"), *g=fopen("zebughil.out","w");

struct Camioane { int ramas, nrcam; } pd[DOIN];  // kg ramas, nrcam = camioane pana acum

int N, G, Z[MAXN], q, doi[MAXN];

void Citire(){
int i;

    fscanf(f,"%d %d\n",&N,&G);

    for(i=1;i<=N;i++)
        fscanf(f,"%d",&Z[i]);

    doi[0] = 1;
    for(i=1;i<=N+1;i++)
        doi[i] = doi[i-1] * 2;

}

Camioane Minim( Camioane A, Camioane B ){

    if( B.nrcam == -1 )
        return A;

    if( A.nrcam < B.nrcam || ( A.nrcam == B.nrcam && A.ramas < B.ramas ) )
        return A;
        return B;

}

void Rezolvare(){
int i, bit, put, iMAX, NEWramas, NEWnrcam;
Camioane NEW;

    iMAX = doi[N] - 1;

    pd[0].ramas = G;
    pd[0].nrcam = 1;

    for(i=1;i<=iMAX;i++){

        bit = i;
        put = 0;

        pd[i].ramas = 0;
        pd[i].nrcam = -1;

        while( bit > 0 ){

            if( bit % 2 == 1 ){

                NEW = pd[ i - doi[put] ];

                NEW.ramas -= Z[put+1];

                if( NEW.ramas < 0 ){

                    NEW.nrcam ++;
                    NEW.ramas += G;

                }

                pd[i] = Minim( NEW, pd[i] );

            }

            bit /= 2;
            put ++;

        }


    }   fprintf(g,"%d\n", pd[iMAX].nrcam );

}

int main(){

    for(q=1;q<=3;q++){

        Citire();
        Rezolvare();

    }

return 0;
}