Cod sursa(job #436602)

Utilizator Marius_AMarius Marius_A Data 8 aprilie 2010 18:04:50
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 3.43 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEBUG 0

typedef struct gutuie{
	int greut;
	int inalt;
	int rez;
}gutuie;


struct node
{
	int priority;
	int info;
	struct node *next;
}*start,*q,*temp,*new;

typedef struct node *N;

void insert(int itprio)
{
	//int item,itprio;
	new=(struct node *)malloc(sizeof(struct node));
	//printf("ENTER THE ELT.TO BE INSERTED :\t");
	//scanf("%d",&item);
	//printf("ENTER ITS PRIORITY :\t");
	//scanf("%d",&itprio);
	//new->info=item;
	new->priority=itprio;
	if(start==NULL || itprio<start->priority)
	{
		new->next=start;
		start=new;
	}
	else
	{
		q=start;
		while(q->next != NULL && q->next->priority<=itprio)
			q=q->next;
		new->next=q->next;
		q->next=new;
	}
}

int peek()
{
	if(start==NULL)
		return 0;
	else
		return start->priority;
}
void del()
{
	if(start==NULL)
	{
		printf("\nQUEUE UNDERFLOW\n");

	}
	else
	{
		new=start;
		//printf("\nDELETED ITEM IS %d\n",new->info);
		start=start->next;
		free(start);
	}
}

void swap (gutuie *a, gutuie *b)
{
	gutuie c = *a;
	*a = *b;
	*b = c;
}

void qsort_r (gutuie* primul, gutuie* ultimul)
{
	gutuie *mic = primul;
	gutuie *mare = ultimul;
	gutuie  pivot = *(primul+(ultimul-primul)/2);

	while (mic <= mare)
	{
		while ((*mic).rez < pivot.rez || ((*mic).rez == pivot.rez && (*mic).greut > pivot.greut) ) mic++;
		while (pivot.rez < (*mare).rez || (pivot.rez == (*mare).rez && pivot.greut > (*mare).greut)) mare--;

		if (mic < mare) swap (mic++, mare--);
		else mic++;
	}

	if (primul < mare) 
		qsort_r (primul, mare);
	if (mare < ultimul) 
		qsort_r (mare+1, ultimul);
}


int main()
{

	FILE *input;
	FILE *output;

	int i,j,m,n;
	int Nr,H,U;

	int *inaltimi;
	int *greutati;
	int *rezista;
	gutuie *vec;

	int rezultat=0;
	int remains;

	int nr_gutui;
	int diferenta,nivel,niv_curent,alesi_pe_nivel;

	input = fopen("gutui.in","r");
	fscanf(input,"%d %d %d",&Nr,&H,&U);

	inaltimi = (int*)calloc(Nr,sizeof(int));
	greutati = (int*)calloc(Nr,sizeof(int));
	rezista = (int*)calloc(Nr,sizeof(int));
	vec = (gutuie*)calloc(Nr,sizeof(gutuie));

	for(i=0;i<Nr;i++){
		fscanf(input,"%d %d",&(vec[i].inalt),&(vec[i].greut));
	}
	fclose(input);

	for(i=0;i<Nr;i++)
		vec[i].rez = (H-vec[i].inalt)/U+1;

	qsort_r(vec,vec+Nr-1);

	for(i=0;i<Nr;i++)
		printf("%d %d %d\n", vec[i].greut,vec[i].rez,vec[i].inalt);

	remains = 0;

	nivel = vec[0].rez;
	niv_curent = nivel;
	printf("incep");
	//inserez primele
	for(i=0;i<nivel;i++)
		insert(vec[i].greut);
	
	diferenta =0;
	alesi_pe_nivel = nivel;

	for(i=nivel;i<Nr;i++){
		if(vec[i].rez > nivel){
			printf("schimb");
			niv_curent = vec[i].rez;
			diferenta = niv_curent - nivel;
			nivel=niv_curent;
			//aleg diferenta
			insert(vec[i].greut);
			diferenta -=1;
			alesi_pe_nivel =1;
		}else
		{
			if(diferenta>0){
				insert(vec[i].greut);
				diferenta -=1;
				alesi_pe_nivel+=1;
			}
			else
			{
				if(alesi_pe_nivel < niv_curent){
					if(peek() < vec[i].greut){
						del();
						insert(vec[i].greut);
						alesi_pe_nivel+=1;
					}
				}
			}
		}
	}

	diferenta =0;

	while(start != NULL)
	{
		diferenta += peek();
		del();
	}

	/*
	for(i=Nr-1;i>=0;i--)
		if(vec[i].rez - remains > 0){
			rezultat +=  vec[i].greut;
			remains+=1;
			printf("aleg: %d %d\n",vec[i].greut,vec[i].rez);
		}
		*/
	printf("%d",diferenta);
	return 0;
}