Cod sursa(job #441091)

Utilizator moroMOROSAN EMANUEL moro Data 12 aprilie 2010 19:15:27
Problema Gutui Scor 30
Compilator c Status done
Runda teme_upb Marime 3.4 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct{
	int h, g, niv; 
	}gutui;


void quickSort1(gutui *vect, int stanga, int dreapta) {  
	int i = stanga, j = dreapta;  
	int tmp1, tmp2, tmp3;  
	int pivot = vect[dreapta].niv;  
	while (i <= j){  
		while (vect[i].niv < pivot)  
			i++;  
		while (vect[j].niv > pivot)  
			j--;  
		if (i <= j){
            tmp1=vect[i].niv;  
			vect[i].niv=vect[j].niv;  
			vect[j].niv=tmp1;
			tmp2=vect[i].h;  
			vect[i].h=vect[j].h;  
			vect[j].h=tmp2;
			tmp3=vect[i].g;  
			vect[i].g=vect[j].g;  
			vect[j].g=tmp3;
            i++;  
            j--;  
			}  
		}  
	if (stanga < j)  
		quickSort1(vect, stanga, j);  
	if (i < dreapta)  
		quickSort1(vect, i, dreapta);  
}

void quickSort2(gutui *vect, int stanga, int dreapta) {  
	int i = stanga, j = dreapta;  
	int tmp1, tmp2, tmp3;  
	int pivot = vect[dreapta].g;  
	while (i <= j){  
		while (vect[i].g > pivot)  
			i++;  
		while (vect[j].g < pivot)  
			j--;  
		if (i <= j){
            tmp1=vect[i].niv;  
			vect[i].niv=vect[j].niv;  
			vect[j].niv=tmp1;
			tmp2=vect[i].h;  
			vect[i].h=vect[j].h;  
			vect[j].h=tmp2;
			tmp3=vect[i].g;  
			vect[i].g=vect[j].g;  
			vect[j].g=tmp3;
            i++;  
            j--;  
			}  
		}  
	if (stanga < j)  
		quickSort2(vect, stanga, j);  
	if (i < dreapta)  
		quickSort2(vect, i, dreapta);  
}

void quickSort(int *vect, int stanga, int dreapta) {  
	int i = stanga, j = dreapta;  
	int tmp;  
	int pivot = vect[dreapta];  
	while (i <= j) {  
		while (vect[i] > pivot)  
			i++;  
		while (vect[j] < pivot)  
			j--;  
		if (i <= j) {  
			tmp = vect[i];  
            vect[i] =vect[j];  
            vect[j] = tmp;  
            i++;  
            j--;  
		}  
     }  
	if (stanga < j)  
		quickSort(vect, stanga, j);  
	if (i < dreapta)  
		quickSort(vect, i, dreapta);  
}  


int main(){
	int n, h, u, i, j, k, *a, nivele, suma=0, t, aux, max;
	gutui *gut;
	
	//citire
	FILE *fo, *fc;
	fo=fopen("gutui.in", "r");
	fscanf(fo,"%d%d%d", &n, &h, &u);
	gut=(gutui*)malloc(n*sizeof(gutui));
	a=(int*)malloc(n*sizeof(int));
	
	for(i=0;i<n;i++){
		fscanf(fo,"%d%d", &gut[i].h, &gut[i].g);
		gut[i].niv=(h-gut[i].h)/u+1;
		if(gut[i].h>h || gut[i].h<0)
			gut[i].niv=0;	
		}
	fclose(fo);
	
	quickSort1(gut,0,n-1);
		
	i=0;
	for(j=0;j<n;j++){
		if(gut[i].niv!=gut[j].niv){
			quickSort2(gut,i,j-1);
			i=j;
			}
		}
	
	quickSort2(gut,i,n-1);
	
	max=gut[n-1].niv;

	for(i=0;i<n;i++)
		printf("%d\t", gut[i].g);
	printf("\n");
	for(i=0;i<n;i++)
		printf("%d\t", gut[i].h);
	printf("\n");
	for(i=0;i<n;i++)
		printf("%d\t", gut[i].niv);
	printf("\n");
	printf("\n");		

	
	k=0;
	t=0;
	i=0;
	aux=0;
	while(i<n){
		k=gut[i].niv;
		j=0;
		while(j<k && gut[i+j].niv==k){
			a[t]=gut[i+j].g;
			t++;
			j++;
			}
		i=i+j;
		while(k==gut[i].niv){
			i++;
			}
		} 

	/*
	k=0;
	t=0;
	i=0;
	while(i<n){
		k=0;
		for(j=0;j<gut[i].niv;j++)
			if(gut[i].niv==gut[i+j].niv)
				a[t++]=gut[i+j].g;
			else{
				k=1;
				break;
				}	
		if(k==0){
			while(gut[i+j-1].niv==gut[i+j].niv && (i+j)<n)
				j++;
			i=i+j;
			}
		else 
			i=i+j;
		}
	*/
	
	printf("\nt=%d n=%d max=%d \n", t, n, max);
	
	for(i=0;i<t;i++)
		printf("%d ", a[i]);
	printf("\n");	
	
	quickSort(a,0,n-1);
	
	for(i=0;i<t;i++)
		printf("%d ", a[i]);
	printf("\n");

	
	//printf("\nt=%d\n", t);
	for(i=0;i<max && i<t;i++)
		suma=suma+a[i];
		
	printf("%d\n",suma);
	
	fc=fopen("gutui.out", "w");
	fprintf(fc,"%d\n",suma);
	fclose(fc);
	
	free(gut);
	free(a);

	return 0;	
	}