Cod sursa(job #468008)

Utilizator simona.poilincaSimona Poilinca simona.poilinca Data 1 iulie 2010 20:56:26
Problema Gutui Scor 60
Compilator c Status done
Runda teme_upb Marime 2.5 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INF 1000


void swap(int *x,int *y)
{
   int temp;
   temp = *x;
   *x = *y;
   *y = temp;
}

int choose_pivot(int i,int j )
{
   return((i+j) /2);
}

void quicksort(int list[], int list2[],int m,int n)
{
   int key,i,j,k;
   if( m < n)
   {
      k = choose_pivot(m,n);
      swap(&list[m],&list[k]);
      swap(&list2[m],&list2[k]);
      key = list[m];
      i = m+1;
      j = n;
      while(i <= j)
      {
         while((i <= n) && (list[i] >= key))
                i++;
         while((j >= m) && (list[j] < key))
                j--;
         if( i < j)
         	{
                swap(&list[i],&list[j]);
                swap(&list2[i],&list2[j]);
                }
      }
	  // swap two elements
      swap(&list[m],&list[j]);
      swap(&list2[m],&list2[j]);
	  // recursively sort the lesser list
      quicksort(list,list2,m,j-1);
      quicksort(list,list2,j+1,n);
   }
}
void printlist(int list[],int n)
{
   int i;
   for(i=0;i<n;i++)
      printf("%i ",list[i]);
   printf("\n");
}


int main()
{

int N, H, U, i, j, k, max;
int* inaltime;
int* greutate;
int** scor;
FILE* f;
FILE* g;

f= fopen("gutui.in","r");
fscanf(f, "%i %i %i\n", &N, &H, &U);

inaltime = (int*)calloc(N,sizeof(int*));
greutate = (int*)calloc(N,sizeof(int*));
scor = (int**)calloc(N,sizeof(int*));

for (i=0; i<N; i++)
	{
	fscanf(f, "%i %i\n", &inaltime[i], &greutate[i]);
	scor[i] = (int*)calloc(N,sizeof(int));
	}
	

//Sortez descrescator dupa inaltime gutuile (deci se modifica si inaltime[] si greutate[]). 
quicksort(inaltime,greutate,0,N-1);

//prima coloana a matricii scor va fi initializata cu greutatile 
for (i=0;i<N;i++)
	if (inaltime[i]<=H)
		scor[i][0] = greutate[i];
	else
		scor[i][0] = -INF;


for (i=0;i<N;i++)
	for(j=1;j<N;j++)
		if (inaltime[i]+j*U <= H) //daca gutuia nu este prea sus
			{
			max=0;
			//calculez maximul de pe coloana k-1 
			for(k=0;k<i;k++)
				if (scor[k][j-1]>max)
					max=scor[k][j-1];
			//scor[i][j] = cea mai mare cantitate ce o pot recolta alegand dintre gutuile {1,2,...i}, ultima gutuie aleasa
			//fiind gutuia i si fiind a j+1 -a (adica au mai fost alese inainte j gutui)
			scor[i][j] = greutate[i] + max;	
			}
		else scor[i][j] = -INF;
			

//aflu greutatea maxima
max=0;
for (i=1;i<N;i++)
	{
	for (j=0;j<N;j++)
		{
		if (scor[i][j]>max)
			max=scor[i][j];
		//printf("%i ",scor[i][j]);
		}
	//printf("\n");
	}


g= fopen("gutui.out","w");
fprintf(g, "%i", max);
fclose(f);
fclose(g);
free(scor);
free(inaltime);
free(greutate);

return 0;

}