Cod sursa(job #1471511)

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

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

struct lista *prim=NULL;

int adauga(int energie,int 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;
    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);
            adauga(tmp_e,tmp_c);
            sum_e+=tmp_e;
        }
        fclose(f);
        f=fopen("energii.out","w");
        if (sum_e<w) fprintf(f,"-1");
        else {
            int ok;
            struct lista *t,*min1,*min2,*z;
            do {
                ok=0;
                min1=min2=NULL;
                for (t=prim; t!=NULL && min1==NULL; t=t->u)
                    if (t->e<w) min1=t;
                if (min1!=NULL) {
                    for (; t!=NULL && min2==NULL; t=t->u)
                        if (t->e<w) {
                            if (t->c<min1->c)
                                { min2=min1; min1=t; }
                                else min2=t;
                        }
                    if (min2!=NULL) {
                        for (; t!=NULL; t=t->u)
                            if (t->e<w) {
                                if (t->c<min1->c) { min2=min1; min1=t; }
                                else { if (t->c<min2->c) min2=t; }
                            }
                    }
                }
                if (min1!=NULL && min2!=NULL) {
                    ok=1;
                    min1->e+=min2->e;
                    min1->c+=min2->c;
                    sterge(min2);
                }
            } 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);
}