Pagini recente » Cod sursa (job #2423409) | Cod sursa (job #2391529) | infoarena - te ajutam sa devii olimpic! | Cod sursa (job #1061119) | Cod sursa (job #441550)
Cod sursa(job #441550)
/*
* Gutu Marius Gabriel
* 321CA
*
* Proiectarea Algoritmilor
* Tema 1
* Gutui
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INF 320
typedef struct
{
long int h;
long int w;
} gutuie;
gutuie *gut;
int compare (const void * a, const void * b)
{
if(((gutuie *)a)->h != ((gutuie *)b)->h)
//if(*(long int*)gut[(gutuie *)a-gut].h!=*(long int*)gut[(gutuie *)b-gut].h)
return ((gutuie*)b)->w - ((gutuie*)a)->w;
//return ( *(long int*)gut[(gutuie *)a-gut].h - *(long int*)gut[(gutuie *)b-gut].h );
//return ( *(long int*)gut[(gutuie *)a-gut].w - *(long int*)gut[(gutuie *)b-gut].w );
return ((gutuie*)b)->h - ((gutuie*)a)->h;
}
/*int compare (const void * a, const void * b)
{
if((gutuie *)a->h(gutuie *)b->h)return ( *(long int*)gut[a].h - *(long int*)gut[b].h );
return ( *(long int*)gut[a].w - *(long int*)gut[b].w );
}*/
int main()
{
/* Variabile principale */
long int
N, // numarul de gutui din copac
H, // inaltimea maxima la care ajunge Gigel
U; // cu cat se ridica crengile copacului dupa culegerea unei gutui
long int
gout; // greutatea maxima a gutuilor pe care le poate culege Gigel
long int
i, j, // contoare auxiliare
//sortat,
minh,
aux;
long int
*nivel;
// fisierele de intrare si de iesire
FILE *fin, *fout;
fin = fopen ("gutui.in","r");
fout = fopen ("gutui.out","w");
// citim N, H si U
fscanf(fin,"%ld %ld %ld",&N,&H,&U);
// alocam spatiu pentru vectorul de greutati si pentru cel de
// inaltimi
gut = (gutuie *) malloc (N*sizeof(gutuie));
// citim perechile corespunzatoare inaltime-greutate pentru
// fiecare gutuie
for (i=0; i<N; i++)
fscanf(fin,"%ld %ld",&gut[i].h,&gut[i].w);
// setam greutatea maxima pe care o poate obtine Gigel la 0
gout = 0;
// sortare dupa greutati
/*sortat = 0;
do
{
sortat = 1;
for (i=0; i<N-1; i++)
if (w[i]<w[i+1])
{
sortat = 0;
aux = w[i];
w[i] = w[i+1];
w[i+1] = aux;
aux = h[i];
h[i] = h[i+1];
h[i+1] = aux;
}
else if (w[i]==w[i+1])
{
// sortez dupa h
if (h[i]<h[i+1])
{
sortat = 0;
aux = w[i];
w[i] = w[i+1];
w[i+1] = aux;
aux = h[i];
h[i] = h[i+1];
h[i+1] = aux;
}
}
} while (sortat == 0);*/
qsort(gut, N, sizeof(gutuie), compare);
minh = INF;
for (i=0; i<N; i++)
{
if (gut[i].h < minh)
minh = gut[i].h;
printf ("%ld\tw=%ld\th=%ld\t\n",i,gut[i].w,gut[i].h);
}
minh = (H-minh)/U+1;
minh++;
nivel = (long int *) calloc ((minh+5),sizeof(long int));
printf ("minh=%ld\n",minh);
for (i=1; i<=minh; i++) nivel[i] = -1;
for (i=0; i<N; i++)
{
// calculez nivelul
aux = (H - gut[i].h)/U + 1;
if (aux>0)
{
printf ("Pun gutuia %ld pe nivelul %ld\n",i,aux);
if (nivel[aux]==-1) { printf ("am pus-o\n"); nivel[aux] = i; }
else
{
printf ("nu pot\n");
for (j = aux-1; j>=0; j--)
if (nivel[j]==-1)
{
printf ("am pus-o pe %ld\n",j);
nivel[j] = i;
break;
}
}
}
}
printf ("%ld niveluri:\n",minh);
for (i=1; i<=minh; i++)
{
if (nivel[i]!=-1)
printf ("Nivelul %ld: %ld\n",i,gut[nivel[i]].w);
else
printf ("Nivelul %ld: %d\n",i,0);
}
for (i=1; i<=minh; i++)
{
if (nivel[i]!=-1)
{
//printf (" %ld ",nivel[i][0]);
//for (j=1; j<=nivel[i][0]; j++)
if (gut[nivel[i]].h<=H) {
printf ("Iau gutuia %ld de pe nivelul %ld\n",gut[nivel[i]].w,i);
gout += gut[nivel[i]].w;
H -= U;
}
}
}
// afisam greutatea maxima pe care o poate culege Gigel in fisier
fprintf (fout,"%ld\n",gout);
// inchidem fisierele
fclose(fin);
fclose(fout);
return 0;
}