Cod sursa(job #1469999)

Utilizator BanhidiBanhidi Zoltan Banhidi Data 10 august 2015 10:34:33
Problema Energii Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.77 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,*max;
            do {
                ok=0; max=NULL;
                for (t=prim; t!=NULL; t=t->u)
                    if (sum_e-t->e>=w && (max==NULL || t->c>max->c))
                        max=t;
                if (max!=NULL && max->c>0) {
                    sum_e-=max->e; sum_c-=max->c;
                    sterge(max); ok=1; }
            } while (ok);
            fprintf(f,"%d",sum_c);
        }
        fclose(f);
    }
    return(0);
}