Cod sursa(job #1471483)

Utilizator BanhidiBanhidi Zoltan Banhidi Data 14 august 2015 09:16:52
Problema Energii Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <stdlib.h>

struct lista {
    int c,e;
    struct lista *u;
};

struct lista *prim=NULL;

int adauga(energie,cost) {
    struct lista *z=(struct lista*)malloc(sizeof(struct lista));
    if (z==NULL) return(0);
    else {
        z->e=energie; z->c=cost;
        z->u=prim; prim=z;
        return(1);
    }
}

int sterge(struct lista *z) {
    if (z==prim) {
        prim=prim->u; free(z);
        return(1);
    }
    else {
        struct lista *t;
        for (t=prim; t->u!=z && t!=NULL; t=t->u);
        if (t==NULL) return(0);
        else {
            t->u=z->u; free(z);
            return(1);
        }
    }
}

int main() {
    int i,g,w,sum_e=0,sum_c=0;
    FILE *f=fopen("energii.in","r");
    if (f==NULL) {
        printf("Eroare deschidere fisier.");
        fflush(stdin); getchar();
    }
    else {
        fscanf(f,"%d",&g); fscanf(f,"%d",&w);
        for (i=0; i<g; i++) {
            int tmp_e,tmp_c;
            fscanf(f,"%d %d",&tmp_e,&tmp_c);
            if (tmp_e>0) {
                adauga(tmp_e,tmp_c);
                sum_e+=tmp_e; sum_c+=tmp_c;
            }
        }
        fclose(f);
        f=fopen("energii.out","w");
        if (sum_e<w) fprintf(f,"-1");
        else {
            int ok;
            struct lista *t,*z,*optim;
            do {
                ok=0;
                for (t=prim; t!=NULL && t->e>=w; t=t->u);
                if (t!=NULL) {
                    optim=NULL;
                    for (z=t->u; z!=NULL; z=z->u)
                        if (z->e<w && (optim==NULL || z->c<optim->c))
                            optim=z;
                    if (optim!=NULL) {
                        optim->e+=t->e;
                        optim->c+=t->c;
                        sterge(t); ok=1;
                    }
                }
            } while(ok);
            z=NULL;
            for (t=prim; t!=NULL; t=t->u)
                if (t->e>=w && (z==NULL || t->c<z->c))
                    z=t;
            fprintf(f,"%d",z->c);
        }
        fclose(f);
    }
    return(0);
}