Pagini recente » Monitorul de evaluare | Cod sursa (job #2631096) | Cod sursa (job #444126) | Cod sursa (job #931998) | Cod sursa (job #439367)
Cod sursa(job #439367)
#include<stdio.h>
#include<stdlib.h>
//structura celula pt lista dublu inlantuita
typedef struct cel
{
cel * next;
cel * pre;
int g;
}celula, *Acelula;
//structura gutuie
typedef struct gut
{
int nivel;
int greutate;
int inaltime;
}gutui;
//fct de comparare pt qsort - sorteaza gutui in fct de inaltime
int comparator2(const void * a,const void *b)
{
return (*((gutui *)b)).inaltime-(*((gutui *)a)).inaltime;
}
//fct insereaza o celula in lista pastrand ordinea crescatoare
void insereaza(Acelula q, Acelula *greutati)
{
Acelula p = *greutati;
//inseram q inaintea listei
if (q->g <= p->g)//cea mai mica
{
q->next = p;
p->pre = q;
*greutati=q;
return;
}
//else p=p->next;
//inseram q inaintea celuluei p
while(p->next)
{
if (q->g > p->g) p=p->next;
else
{
(p->pre)->next = q;
q->pre = p->pre;
q->next = p;
p->pre = q;
return;
}
}
//se analizeaza cazul cand inseram penultima sau ultima celula
if (q->g <= p->g)
{
(p->pre)->next = q;
q->pre = p->pre;
q->next = p;
p->pre = q;
}
else
{
q->pre = p;
p->next = q;
}
}
int main()
{
FILE *f=NULL,*g=NULL;
int N,H,U;
int i,j,niv;
int greutate_culeasa=0;
gutui *mat;
Acelula q, p, *greutati;
//citesc datele de intrare si calculez nivelele pe care sunt asezate gutuile
f=fopen("gutui.in","rt");
fscanf (f,"%i%i%i",&N,&H,&U);
mat = (gutui*)malloc(N*sizeof(gutui));
for(i=0;i<N;i++)
{
fscanf(f,"%i%i",&(mat[i].inaltime),&(mat[i].greutate));
if (mat[i].inaltime > H ) mat[i].nivel = 0;
else mat[i].nivel = ((H-mat[i].inaltime) / U )+1;
}
//sortez dupa inaltime
qsort(mat, N, sizeof(gutui), comparator2);
//creez o lista dublu inlantuita cu greutatile gutuilor pe care le culeg
p = (celula*) malloc(sizeof(celula));
p->next = NULL;
p->pre = NULL;
p->g = mat[0].greutate;
greutati = &p;
niv=1;
for(j=1;j<N;j++)
{
if (mat[j].nivel>niv)
{
//inroduc gutuia in cele culese si incrementez nivelul
q=(celula*) malloc(sizeof(celula));
q->next = NULL;
q->pre = NULL;
q->g = mat[j].greutate;
insereaza(q,greutati);
niv++;
}
else if(mat[j].greutate > (*greutati)->g)
{
//eliberez valoarea minima
q=*greutati;
*greutati=(*greutati)->next;
(*greutati)->pre = NULL;
free(q);
//introduc noua valoare
q=(celula*) malloc(sizeof(celula));
q->next = NULL;
q->pre = NULL;
q->g = mat[j].greutate;
insereaza(q,greutati);
}
}
//scriu datele de iesire
g=fopen("gutui.out","wt");
while((*greutati))
{
q=*greutati;
greutate_culeasa += (*greutati)->g;
*greutati = (*greutati)->next;
free(q);
}
fprintf(g,"%i",greutate_culeasa);
fclose(f);
fclose(g);
return 0;
}