Cod sursa(job #438613)
/**
* Maruseac Andrei
* 325 CC
* Proiectarea Algoritmilor
* Tema 1
* Problema 2: gutui
*/
#include <stdio.h>
#include <stdlib.h>
int N; /* numarul de gutui din copac */
int H; /* inaltimea maxima la care se poate ajunge */
int U; /* cu cat se ridica crengile dupa culegerea unui gutui */
typedef struct gutui {
int h; /* inaltimea la care se afla gutuiul */
int g; /* greutatea gutuiului */
} gutui;
gutui gut[100001];
/**
* functie de comparare a 2 gutui
* a, b elementele de comparat
*/
int comp (const void * a, const void * b)
{
gutui * a1 = (gutui *) a;
gutui * b1 = (gutui *) b;
return b1 -> g - a1 -> g;
}
/**
* functie de citire
* file_name nume fisier
*/
void read (char * file_name)
{
int i;
FILE * fd = fopen (file_name, "r");
// dimensiune matrice
fscanf (fd, "%d", &N);
fscanf (fd, "%d", &H);
fscanf (fd, "%d", &U);
// citire inaltime si greutate gutui
for (i = 0; i < N; i ++) {
fscanf (fd, "%d", &gut[i].h);
gut[i].h = ((gut[i].h - 1) / U + 1) * U;
fscanf (fd, "%d", &gut[i].g);
}
fclose (fd);
}
int calcmax (int dim)
{
int * mom = calloc (dim, sizeof (int));
int i, j, s = 0;
for (i = 0; i < dim; i ++)
if(mom[(H - gut[i].h) / U] == 0)
mom[(H - gut[i].h) / U] = gut[i].g;
else
for (j = (H - gut[i].h) / U; j >= 0; j --)
if(mom[j] == 0)
mom[j] = gut[i].g;
for (i = 0; i < dim; i ++)
printf ("%d ", mom[i]);
for (i = 0; i < dim; i ++)
s = s + mom[i];
return s;
}
void resolv ()
{
int i;
FILE *fd = fopen ("gutui.out", "w");
qsort (gut, N, sizeof (gutui), comp);
fprintf (fd, "%d", calcmax (H / U + 1));
fclose (fd);
}
int main ()
{
read ("gutui.in");
resolv ();
return 0;
}