Cod sursa(job #442844)

Utilizator alexuuRadu Alexandru alexuu Data 15 aprilie 2010 15:31:39
Problema Gutui Scor 80
Compilator c Status done
Runda teme_upb Marime 3.44 kb
#include <stdio.h>
#include <stdlib.h>

int N, H, U;

void merge(int *x, int *w, int l, int m, int r) {
	int i = l, j = m+1, k = 0;
	int *y, *z;
	y = (int *)malloc((r-l+1) * sizeof(int));
	z = (int *)malloc((r-l+1) * sizeof(int));
	while(i<=m && j<=r) {
		if(x[i] >= x[j])
		{
			y[k] = x[i];
			z[k++] = w[i++];
		}
		else
		{
			y[k] = x[j];
			z[k++] = w[j++];
		}
	}

	while(i<=m)
	{
		y[k] = x[i];
		z[k++] = w[i++];
	}
	while(j<=r)
	{
		y[k] = x[j];
		z[k++] = w[j++];
	}
	k = 0;
	for(i = l; i<=r; i++)
	{
		x[i] = y[k];
		w[i] = z[k++];
	}
	free(y);
	free(z);
}

void mergesort(int *x, int *w, int l, int r) {
	int m;
	if(l < r) {
		m = (l + r) / 2;
		mergesort(x, w, l, m);
		mergesort(x, w, m + 1, r);
		merge(x, w, l, m, r);
	}
}
/*
void mergeSmall(int *x, int l, int m, int r) {
	int i = l, j = m+1, k = 0;
	int *y;
	y = (int *)malloc((r-l+1) * sizeof(int));
	while(i<=m && j<=r) {
		if(x[i] >= x[j])
		{
			y[k++] = x[i++];
		}
		else
		{
			y[k++] = x[j++];
		}
	}

	while(i<=m)
	{
		y[k++] = x[i++];
	}
	while(j<=r)
	{
		y[k++] = x[j++];
	}
	k = 0;
	for(i = l; i<=r; i++)
	{
		x[i] = y[k++];
	}
	free(y);
}

void mergesortSmall(int *x, int l, int r) {
	int m;
	if(l < r) {
		m = (l + r) / 2;
		mergesortSmall(x, l, m);
		mergesortSmall(x, m + 1, r);
		mergeSmall(x, l, m, r);
	}
}*/

int main() {
	FILE *fin = fopen("gutui.in", "r");
	FILE *fout = fopen("gutui.out", "w");

	fscanf(fin, "%d%d%d", &N, &H, &U);
	int i, j, timp = 1, nrGutuiMax, cantar = 0, ok, min;
	int *h, *g, *ajunsa, *cosh;

	h = (int *)malloc(N * sizeof(int));
	g = (int *)malloc(N * sizeof(int));
	ajunsa = (int *)malloc(N * sizeof(int));

	for (i = 0; i < N; i++)
	{
		fscanf(fin, "%d%d", &h[i], &g[i]);
	}

	for (i = 0; i < N; i++)
	{
		printf("%d\t%d\n", h[i], g[i]);
	}
	mergesort(h, g, 0, N - 1);
	min = h[N - 1];
	printf("\n\n");
	for (i = 0; i < N; i++)
	{
		printf("%d\t%d\n", h[i], g[i]);
	}

	mergesort(g, h, 0, N - 1);
	printf("\n\n");
	for (i = 0; i < N; i++)
	{
		printf("%d\t%d\n", h[i], g[i]);
	}

	for (i = 0; i < N; i++)
	{
		ajunsa[i] = (H - h[i] + U)/U;
	}
	printf("\n\n");
	for (i = 0; i < N; i++)
	{
		printf("%d\n", ajunsa[i]);
	}
		
	nrGutuiMax = (H - min + U)/U;
	printf("Numar maxim de gutui: %d\n", nrGutuiMax);
	cosh = (int *)malloc(nrGutuiMax * sizeof(int));

	for (i = 0; i < nrGutuiMax; i++)
		cosh[i] = 0;

	int *nrNivel;
	nrNivel = (int *)malloc((nrGutuiMax + 1) * sizeof(int));
	for (i = 1; i <= nrGutuiMax; i++)
		nrNivel[i] = i;
	i = 0;
	j = 0;
	int promis = 0;
	int k = 0;
	while (i < N && j < nrGutuiMax)
	{
		if (ajunsa[i] > 0)
		{
			cantar += g[i];
			j++;
			for (k = i+1 ; k < N; k++)
				if (ajunsa[k] >= ajunsa[i])
					ajunsa[k]--;
		}
		
		//ok = 0;
		//printf("a %d-a gutuie\n", i);
		/*
		if (ajunsa[i] >= timp && nrNivel[ajunsa[i]] > 0)
		{
			//if (ajunsa[i] >= promis)
		//	{
				j++;
				cantar += g[i];
				//if (ajunsa[i] > promis)
					//promis;
			//	if (ajunsa[i] == promis)
				//	promis++;
				printf("i s-a promis\n");
			nrNivel[ajunsa[i]]--;
			if (nrNivel[ajunsa[i]] == 0)
				timp++;
			//nrGutuiMax--;
			//}
		}
		*/
		/*
		if (ajunsa[i] == timp)
		{
			j++;
			cantar += g[i];
			nrNivel[ajunsa[i]]--;
			if (nrNivel[ajunsa[i]] == 0)
				timp++;
			printf("a fost luata\n");*/
			i++;
			//promis++;
		
	
		//printf("kile de gutui %d: %d\n\n", k++, cantar);
		//i++;
		
	}
	printf("numar gutui: %d\n", j);
	printf("\n kile de gutui: %d\n",cantar);
	fprintf(fout, "%d", cantar);

	free(h);
	free(g);
	free(ajunsa);
	free(cosh);

	fclose(fin);
	fclose(fout);
	return 0;
}