Cod sursa(job #439670)

Utilizator hot_chocolatePirvan Anca hot_chocolate Data 11 aprilie 2010 18:14:07
Problema Gutui Scor 40
Compilator c Status done
Runda teme_upb Marime 3.16 kb
//s=vectorul unde bag gutuile pe care le culeg
//H-inaltimea maxima la care ajunge Gigel
//U-cu cat se ridica crengile
//g-greutate fruct
//h-inaltime fruct
//G-greutate maxima
//N-nr gutui


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

typedef struct gut
{
	unsigned int nivel;
	unsigned int g;
}gutuie;
//gutuile de la inaltime mare le iau primele ,sortez descr
//profit=greutate, job=gutuie

int compare(const void*x,const void* y)
{
	if((*(gutuie*)x).nivel == (*(gutuie*)y).nivel)
		return ( (*(gutuie*)x).g - (*(gutuie*)y).g ) ;
	else
		return  -((*(gutuie*)x).nivel-(*(gutuie*)y).nivel);
}
void coboara(unsigned int*,unsigned int, unsigned int);
void sterge(unsigned int *s, unsigned int *dim) {
	s[0] = s[--(*dim)];
	coboara (s,0,*dim);
}
//functie care schimba radacina si o coboara 
void coboara(unsigned int *s,unsigned int i,unsigned int dim) //i va fi mereu 0 k bag in varf , dim=dimensiune
{	
	if (dim==1) return;
	unsigned int stg = 2*i+1;
	unsigned int dr = 2*i+2;
	unsigned int min;
	if(stg <dim && s[stg]<s[i])
		min=stg;
	else
		min=i;
	if(dr < dim && s[dr]<s[min])
		min=dr;
	unsigned int aux = s[i];
	s[i] = s[min];
	s[min] = aux;
	
	if (i == min)
		return;
	else
		coboara(s,min,dim);
}
void ridica (unsigned int *s, int poz,unsigned int dim) {
	int parinte = (poz-1)/2;
	unsigned int aux;
	if (s[parinte]>s[poz]) {
		aux = s[parinte];
		s[parinte] = s[poz];
		s[poz] = aux;
		ridica(s,parinte,dim);
	}
}
//functie care insereaza pe ultimul loc si ridica elementul
void insereaza(unsigned int *s,unsigned int *dim, unsigned int x)
{
	int poz = *dim;
	s[poz] = x;
	(*dim)++;
	ridica(s,poz,(*dim));
}
void afisare_heap(unsigned int *s, int dim) {
	int i=0;
	printf(">>>");
	for (i=0;i<dim;i++)
		printf("%d ", s[i]);
	printf("\n");
}

int main()
{
	FILE *f,*g;
	f=fopen("gutui.in","r");
	g=fopen("gutui.out","w");
	unsigned int N;
	unsigned int H;
	unsigned int U;
	unsigned int h;
	unsigned int *s; //heap
	unsigned int G;
	unsigned int i;
	unsigned int index=0;
	unsigned int dim_heap;
	unsigned int sum=0;
	gutuie *x;
	fscanf(f,"%u",&N);
	fscanf(f,"%u",&H);
	fscanf(f,"%u",&U);
	s=(unsigned int*)calloc(N,sizeof(unsigned int)), dim_heap=0;
	x=(gutuie*)malloc(N*sizeof(gutuie));
	for(i=0;i<N;i++)
	{
		fscanf(f,"%u",&(x[i].nivel));
		fscanf(f,"%u",&(x[i].g));
		//x[i].nivel=1+(H-x[i].nivel)/U; //?
	}
	
	/*for (i=0;i<N;++i) {
		printf("%u %u\n", x[i].nivel, x[i].g);
	}	
	printf("\n");*/
	//sortez descrescator dupa inaltime
	qsort(x, N, sizeof(gutuie), compare);
	/*for (i=0;i<N;++i) {
		printf("%u %u\n", x[i].nivel, x[i].g);
	}	
	printf("\n");*/
	//parcurg vectorul de struct ,vad pe ce nivel sunt de fiec data( dim max=N a heap va fi nivelul pe care sunt) si bag greutatile in heap
	/*
	for(i=0;i<N;i++)
		if(index<x[i].nivel)
			ins_ult(s,
			index++
		else
			inser
	*/
	
	unsigned int nivel = 0,curr_nivel;
	insereaza(s,&dim_heap,x[0].g);
	H-=U;
	for (i=1;i<N;++i) {
		if (x[i].nivel > H && x[i].g > s[0]) {
			sterge(s,&dim_heap);
			insereaza(s,&dim_heap,x[i].g);
			afisare_heap(s,dim_heap);
		}
		if (x[i].nivel <= H) {
			insereaza(s,&dim_heap,x[i].g);
			afisare_heap(s,dim_heap);
			H-=U;
		}
	}
	for (i=0;i<dim_heap;++i) {
		sum+=s[i];
		
	}
	fprintf(g,"%u",sum);
	
fclose(f);
fclose(g);
return 0;
}