Cod sursa(job #463084)

Utilizator simona.poilincaSimona Poilinca simona.poilinca Data 14 iunie 2010 15:16:49
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 4.03 kb
/*
	Nume:Ene
	Prenume:Stefan
	Grupa:321CA
*/

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

typedef struct {
	int greutate;
	int inaltime;
	int folosit;
}Fruct;
//In aceasta structura pastrez informatiile despre fiecare gutuie,inaltimea ,greutatea si folosit (daca am cercetat acea gutuie) (0 nefolosita si 1 folosita)

void quicksort(int n,Fruct arr[n] ,int low, int high) {
 	int i = low;
 	int j = high;
 	Fruct y;
 
 	int z = arr[(low + high) / 2].inaltime;

 	do {
  
  		while(arr[i].inaltime > z) i++;

  		while(arr[j].inaltime < z) j--;

  		if(i <= j) {
   
   			y = arr[i];
   			arr[i] = arr[j]; 
   			arr[j] = y;
   			i++; 
   			j--;
  		}
 	} while(i <= j);

 	if(low < j) 
  		quicksort(n,arr, low, j);

 	if(i < high) 
  		quicksort(n,arr, i, high); 
}
//Am folosit un quichsort ca sa sortez vectorul de fructe dupa inaltime si pe urma subvectorii de aceeasi inaltime dupa greutate
//Algoritmul si codul de quicksort a fost luat de pe net
void quicksort2(int n,Fruct arr[n] ,int low, int high) {
	int i = low;
 	int j = high;
 	Fruct y;
 	int z = arr[(low + high) / 2].greutate;

 	do {
 	
  		while(arr[i].greutate > z) i++;

//gasesc elementul de jos
  		while(arr[j].greutate < z) j--;

  		if(i <= j) {
//interschimb 2 elemente  
  			y = arr[i];
			arr[i] = arr[j]; 
		 	arr[j] = y;
	   		i++; 
	   		j--;
  		}
 	} while(i <= j);

 	if(low < j) 
  		quicksort2(n,arr, low, j);

 	if(i < high) 
  		quicksort2(n,arr, i, high); 
}


//sortez subvectorul de gutui dupa greutate ,inceput si sfarsit reprezinta marginile subvectorului 

int gasit_numar_mai_mic(int n,int contor,int *vector_suma,int aux)//aceasta functie cauta daca exista o gutuie in vectorul de gutui dorite a fi culese ,mai mica ca si greutate decat o alta gutuie. 
{
	int i,mic = vector_suma[0];
	
	for(i = 0; i < contor ; i++)
		if(mic > vector_suma[i])
			mic = vector_suma[i];
	
	//caut cea mai mica gutuie din vector
	if(aux > mic)//daca gutuia care as dori sa o introduc in vector este mai mare decat cea mai mica existenta o voi introduce,altfel nu fac nimic la vectorul de gutui dat spre cules
	{
		for(i = 0; i < contor ; i++)
			if(mic == vector_suma[i]){
				
				vector_suma[i] = aux;
				break;
			}
		
		return 1;
	}
	
	return 0;	
//0 si 1 doar valori pentru verificare	
}
void functie1(int n,int H,int U,int interval_timp,int vector_suma[interval_timp],int contor,Fruct fruct[n])//in aceasta functie verific daca o gutuie poate sa fie introdusa direct in vectorul de gutui dorit sa se culeaga sau daca trebuie sa vad daca merge sa nu introdusa in locul celei mai mici gutui
{
	int i,gasit;

	for(i = 0; i < n ; i++)
	{	
		gasit = 0;
		
		if(fruct[i].inaltime + ( contor * U ) <= H)
		{
					
			vector_suma[contor] = fruct[i].greutate;
			contor = contor + 1;
			fruct[i].folosit = 1;		
		}		
		// maresc contorul fiindca am marit vectorul cu o gutuie.
		if(fruct[i].inaltime + ( contor * U ) > H && fruct[i].folosit == 0)
		{
			
			gasit = gasit_numar_mai_mic(n,contor,vector_suma,fruct[i].greutate);
		}
	// nu maresc contorul fiindca in cel mai bun caz am inlocuit gutuia cea mai mica cu una mai mare
	}

	if(contor > interval_timp)
		printf("EROARE\n");
	//pentru verificare
	
	int sum = 0;

	for(i = 0; i < contor ; i++)
	{
		
		sum = sum + vector_suma[i];
	}
	//in sum se afla suma culeasa de Gigel
	
	FILE *f;
	f=fopen("gutui.out","w");
	fprintf(f,"%d",sum);
	fclose(f);

}
int main ()
{
	FILE *f;
	f = fopen("gutui.in","r");
	int n;
	fscanf(f,"%d",&n);
	int H,U;
	fscanf(f,"%d %d",&H,&U);
	Fruct fruct[n];
	int i;	

	for(i = 0 ;i < n ;i++)
	{
		fscanf(f,"%d %d",&fruct[i].inaltime,&fruct[i].greutate);
		fruct[i].folosit = 0;
	}

	quicksort(n,fruct,0,n-1);
	
	/*j=0;
	for(i = 0;i < n;i++)
	{
		if((fruct[j].inaltime / U )!= (fruct[i].inaltime / U))
		{
			quicksort2(n,fruct,j, i-1);
			
			j = i;
		}
	}*/
	
	int interval_timp = (H / U) + 1;
	int vector_suma[interval_timp];
	int contor = 0;
	//printf("%d \n",interval_timp);
	functie1(n,H,U,interval_timp,vector_suma,contor,fruct);
	fclose(f);

	return 0;
}