Cod sursa(job #440565)

Utilizator GrrreenVoinea Maria Anemona Grrreen Data 12 aprilie 2010 09:07:05
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 2.26 kb
//Voinea Maria Anemona 321CA
//--------Tema 1 PA---------

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

int partition (int *a, int *b, int start, int stop, int pivot) {
	int pival=a[pivot];
	int aux, i, j=start;
	aux = a[pivot];
	a[pivot] = a[stop];
	a[stop] = aux;
	aux = b[pivot];
	b[pivot] = b[stop];
	b[stop] = aux;
	for (i = start; i < stop; i++) 
		if (a[i] > pival)  
		{
			aux = a[i];
			a[i] = a[j];
			a[j] = aux;
			aux = b[i];
			b[i] = b[j];
			b[j] = aux;
			j++;
		}
	aux = a[j];
	a[j] = a[stop];
	a[stop] = aux;
	aux = b[j];
	b[j] = b[stop];
	b[stop] = aux;
 	return j;
}

void quicksort(int *a, int *b, int start, int stop)
{
	if (stop > start)
	{
		int pivot = (start+stop)/2;
		int pivotnou = partition(a, b, start, stop, pivot);
		quicksort(a, b, start, pivotnou);
		quicksort(a, b, pivotnou + 1, stop);
	}
}

int main()
{
	FILE *in, *out;
	int i, N, H, U, *h, *g, G=0, gutui=0, etape=0, curent=0;
	char s[50], *ordine;
	in = fopen("gutui.in", "r");
	out = fopen("gutui.out", "w");
	
	fgets(s, 50, in);
	sscanf(s, "%d%d%d", &N, &H, &U);
	//printf("%d %d %d\n", N, H, U);
	
	h = (int*)malloc(N*sizeof(int));
	g = (int*)malloc(N*sizeof(int));

	for(i=0; i<N; i++)
	{
		fgets(s, 50, in);
		sscanf(s, "%d%d", h+i, g+i);
	}
	fclose(in);
	
	//Calculul numarului maxim de gutui culese (numarul de etape ale culesului)
	for(i=0; i<N; i++)
	{
			if( H-h[i] >= 0 && (H-h[i]) / U + 1 > etape )
				etape = (H-h[i]) / U + 1;
	}
	//printf("Etape: %d\n", etape);
	if(!etape)
	{
		fprintf(out, "0"); //nu se poate culege nimic
		return 0;
	}

	//Sortare dupa greutate
	quicksort(g, h, 0, N-1);

	ordine = (char*)malloc(etape*sizeof(char));
	memset(ordine, -1, etape);
	for(i=0; i<etape; i++)
		printf("%d ", ordine[i]);
	for(curent=0; curent < N && gutui < etape; curent++)
	{
		if(H - h[curent] >= 0) //etapa maxima la care se poate culege gutuia curenta
		{
			i = (H - h[curent]) / U;
			//Daca a mai fost culeasa o gutuie in etapa i, incearca etapa anterioara
			while( i >= 0 && ordine[i] > 0)
				i--;
			if(i >= 0) //daca s-a putut alege gutuia
			{
				G += g[curent];
				ordine[i] = 1;
				gutui++;
				printf("Culeasa cea de inaltime %d si de greutate %d\n", h[curent], g[curent]);
			}
		}
	}
	fprintf(out, "%d", G);
	fclose(out);
	free(h);
	free(g);
	free(ordine);
	return 0;
}