Pagini recente » Cod sursa (job #2094017) | Cod sursa (job #21193) | Cod sursa (job #1627327) | Cod sursa (job #2138342) | Cod sursa (job #1471511)
#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);
}