Cod sursa(job #441595)

Utilizator moroMOROSAN EMANUEL moro Data 12 aprilie 2010 23:30:32
Problema Gutui Scor 50
Compilator cpp Status done
Runda teme_upb Marime 2.82 kb
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;

typedef struct{
	int h, g, niv; 
	}gutui;
	
bool comparator(gutui g1,gutui g2){
	return g1.niv<g2.niv;
	}

void quicksort(gutui *data, int N)
{
  int i, j, v;
  int tmp1,tmp2,tmp3;
 
  if( N <= 1 )
    return;
 
  // Partition elements
  v = data[0].niv;
  i = 0;
  j = N;
  for(;;)
  {
    while(data[++i].niv < v && i < N) { }
    while(data[--j].niv > v) { }
    if( i >= j )
      break;
    tmp1=data[i].niv;  
	data[i].niv=data[j].niv;  
	data[j].niv=tmp1;
	tmp2=data[i].h;  
	data[i].h=data[j].h;  
	data[j].h=tmp2;
	tmp3=data[i].g;  
	data[i].g=data[j].g;  
	data[j].g=tmp3;
  }
	tmp1=data[i-1].niv;  
	data[i-1].niv=data[0].niv;  
	data[0].niv=tmp1;
	tmp2=data[i-1].h;  
	data[i-1].h=data[0].h;  
	data[0].h=tmp2;
	tmp3=data[i-1].g;  
	data[i-1].g=data[0].g;  
	data[0].g=tmp3;
  
  quicksort(data, i-1);
  quicksort(data+i, N-i);
} 

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);  
}

int main(){
	int n, h, u, i, j, k, *a, suma=0, t, dim=0, min;
	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);
	
	//sortare dupa nivelul fata de h maxim
	//quickSort1(gut,0,n-1);
	//quicksort(gut,n);
	sort(gut,gut+n,comparator);
		
	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");		
	
	//creare vector cu elemnte maxime (care cor reprezenta greutatea finala) 
	dim=0;
	t=0;
	k=0;
	for(i=0;i<n;i++){
		if(dim<gut[i].niv){
			a[dim]=gut[i].g;
			dim++;
			}
		else{
			min=a[0];
			for(j=0;j<dim;j++)
				if(min>a[j]){
					min=a[j];
					t=j;
					}		
			if(min<gut[i].g)
				a[t]=gut[i].g;
			}
		}
	
	for(i=0;i<dim;i++)
		printf("%d ", a[i]);
	printf("\n");
	//calcul suma
	for(i=0;i<dim;i++)
		suma=suma+a[i];
		
	printf("%d\n",suma);
	
	//scriere in fisier
	fc=fopen("gutui.out", "w");
	fprintf(fc,"%d\n",suma);
	fclose(fc);
	
	//eliberare memorie
	free(gut);
	free(a);

	return 0;	
	}