Cod sursa(job #435535)

Utilizator kp_itchyAlexandra kp_itchy Data 7 aprilie 2010 16:09:57
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.45 kb
#include<stdio.h>
#include<malloc.h>

typedef struct {
	int inaltime;
	int greutate;
	} gutuie;

//interschimba 2 elemente din vectorul de gutui
void swap(gutuie *a, gutuie *b) {
	gutuie aux;
	aux=*a;
	*a=*b;
	*b=aux;
}

//auxiliar pentru functia de sortare quicksort
int choose_pivot(int i, int j) {
	return ((i+j)/2);
}

//sorteaza descrescator in functie de greutate in vectorul de gutui
void qsort(gutuie *g, int m, int n) {	
	int key,i,j,k;
	if (m<n)
		{
			k=choose_pivot(m,n);
			swap(&g[m],&g[k]);
			key=g[m].greutate;
			i=m+1;
			j=n;
			while (i<=j)
				{
				while ((i<=n)&&(g[i].greutate>=key))
					i++;
				while ((j>=m) &&(g[j].greutate<key))
					j--;
				if (i<j)
					swap(&g[i],&g[j]);
				}
			swap(&g[m],&g[j]);
			qsort(g,m,j-1);
			qsort(g,j+1,n);
		}
	}

int main() {
	//DECLARARI VARIABILE
	int n,h,u,i,j,gt=0;
	FILE *in=fopen("gutui.in","r");
	FILE *out=fopen("gutui.out","w");
	int ordine_cules[100],c;
	fscanf(in,"%d",&n);
	
	//ALOCARI DE MEMORIE
	gutuie *g=(gutuie*)malloc(n*sizeof(gutuie));
	
	/*
	ordine_cules=(int**)malloc(n*sizeof(int*));
	for (i=0;i<n;i++)
		ordine_cules[i]=(int*)malloc(n*sizeof(int));
	*/
	
	//CITIRE DIN FISIER SI COMPLETARE CAMPURI GUTUI	
	fscanf(in,"%d%d",&h,&u);
	for (i=0;i<n;i++)
		fscanf(in,"%d%d",&g[i].inaltime,&g[i].greutate);
	/*
	for (i=0;i<n;i++)
		printf("%d %d\n",g[i].inaltime,g[i].greutate);
	printf("\n");	
	*/
	qsort(g,0,n-1);
	
	for (i=0;i<n;i++)
		printf("%d %d\n",g[i].inaltime,g[i].greutate);
	printf("\n");
	
	int m=-1,max=0,min=g[0].inaltime,aux,p;
	for (i=0;i<n;i++) {
		if (g[i].inaltime>max) max=g[i].inaltime;
		if (g[i].inaltime<min) min=g[i].inaltime;
	}
	printf("max=%d\nmin=%d\n",max,min);	
	max=(h-max)/u;
	for (i=0;i<n;i++) ordine_cules[i]=0;
	
	for (i=0;i<n;i++) {
		p=(h-g[i].inaltime)/u-max;
		if (ordine_cules[p]==0) ordine_cules[p]=i+1;
		else
			{
			aux=p+1;
			while (ordine_cules[aux]!=0) aux++;
			ordine_cules[aux]=i+1;	
			if (m<aux) m=aux;
			}
	}
	printf("nr.el=%d\n",aux+1);
	for (i=0;i<n;i++)
		printf("%d ",ordine_cules[i]);
	printf("\n");
	
	for (i=0;i<(h-min)/u+1;i++)
		gt+=g[ordine_cules[i]-1].greutate;
	printf("gt=%d\n",gt);	
	/*	
		while (ordine_cules[(h-g[i].inaltime)/u][c]!=0) c++;
		ordine_cules[(h-g[i].inaltime)/u][c]=i+1;	
		}
	/*
	for (i=0;i<n;i++) {
		for (j=0;j<n;j++)
			printf("%d ",ordine_cules[i][j]);
		printf("\n");
		}
		
	for (i=0;i<n;i++)
		for (j=0;j<=i;j++)
			if (ordine_cules[i][j]!=0)
				gt+=g[ordine_cules[i][j]-1].greutate;
	fprintf(out,"%d\n",gt);
	*/
		
	
return 0;
}