Cod sursa(job #440040)

Utilizator catamihaCatalina Nita catamiha Data 11 aprilie 2010 21:36:17
Problema Gutui Scor 90
Compilator c Status done
Runda teme_upb Marime 2.37 kb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int *sol;

typedef struct
	{
    unsigned int poz;  // pozitia minimului  in vectorul de solutie
    unsigned int val;  // valoarea minimului
   
} valminime;  // structua de tip minim

typedef struct info_gutuie 

 {unsigned int h; // inaltimea gutuii

  unsigned int g; //greutatea gutuii

   } GUTUIE;

GUTUIE *gutuie;



int relatie (GUTUIE *nr1, GUTUIE *nr2) // ordonare dupa inaltimi iar in caz de egalitate dupa greutate

    	{ 
	  if ((*nr1).h < (*nr2).h) { return 1;}

          if ((*nr1).h > (*nr2).h) return -1;

          if ((*nr1).h == (*nr2).h) {  if ((*nr1).g < (*nr2).g ) return 1;

                                       if ((*nr1).g == (*nr2).g) return 0;

                                       if ((*nr1).g>(*nr2).g)  return -1;
					}
	}
int main()
{
unsigned int n,h,u;

long int suma=0;

int i,j,m,k,nrg,min,culese=0;

FILE *in, *out;

	in=fopen ("gutui.in", "r");

	out=fopen ("gutui.out","w");

fscanf (in,"%u",&n); //nr gutui


valminime *vmin; // vector de minim

gutuie =(GUTUIE*) calloc (n,sizeof (GUTUIE));

sol=(int *) calloc(n,sizeof(int)); // vectorul de solutii

vmin=(valminime*) calloc (n,sizeof(valminime));

fscanf (in,"%u",&h); //inaltime maxima

fscanf (in,"%u", &u); //inaltime gutuie

	for (i=0;i<n;i++) //citire date

		{fscanf (in,"%u", &gutuie[i].h);

		 fscanf (in,"%u",&gutuie[i].g);}

j=0;    // retine numarul de elemente din vectorul de minim

min=0; // intial minimul este 0


 for (i=0;i<n;i++)

             if (gutuie[i].h<min) min=gutuie[i].h; // nivelul minim al arborelui

nrg= (h-min)/u + 1;// nr gutui care pot fi culese

	  qsort(gutuie,n,sizeof(GUTUIE),(void*) relatie); // sortarea vectorului descrescator dupa inaltimi

for (i=0;i<n;i++)
	printf ("%d %d\n", gutuie[i].h, gutuie[i].g);
sol[0]=gutuie[0].g;
//vmin[0].val=gutuie[0].g;
int zona, poz_min;
culese=1;// numarul de gutui culese; initial 1 intrucat in vectorul de solutii se afla deja prima gutuie
   
	
	for (i=0;i<n;i++)

		{zona= (h-gutuie[i].h)/u;
                 min=sol[0];
		poz_min=0;	
		for (j=1; j<=zona;j++)

			if (sol[j]<min)
				{min=sol[j];
				 poz_min=j;
				}
		  if (min<gutuie[i].g)

			sol[poz_min]=gutuie[i].g; }

      for (i=0;i<=zona;i++)
           {printf ("%d ", sol[i]);
		suma=suma+sol[i];}

fprintf(out,"%ld",suma);
free(vmin);
free(gutuie);
free(sol);
fclose(in);
fclose (out);
   return 0;}