Cod sursa(job #427486)

Utilizator Marius_AMarius Marius_A Data 27 martie 2010 21:41:59
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 6.78 kb
/*
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main()
{

	FILE *input;
	FILE *output;

	int i,j,m,n;
	//matricea,si culorile
	char* temp;
	char *p1;
	int *p2;
	char c;
	char **matrice;
	int **numar;
	int *temp2;
	int dimens;

	int nr_1;
	int max;
	int nr;
	int nr_old;
	int changed;

	input = fopen("figuri2.in","r");

	max =1;
	nr = 0;
	nr_1=0;
	//citesc datele
	if(input == NULL)
	{
		printf("Error: can't open file.\n");
	} 
	else 
	{
		printf("File opened. Reading ...\n");
		fscanf(input,"%d",&dimens);
		
		printf("dim : %d", dimens);
		
		temp = (char*)calloc((dimens)*(dimens),sizeof(char));
		matrice = (char**)calloc(dimens, sizeof(char*));

		for(i=0;i<dimens;i++)
			matrice[i] = &temp[i*dimens];//temp[i*(dimens)];

		for(i=0;i<dimens;i++)
    	   for(j=0;j<dimens;j++){  	    
            fscanf(input,"%1d",&n);
            matrice[i][j]=(char)n;
			nr_1+=n;
		   }
		//matrice = (char**)calloc(dimens,char*
		fclose(input);
	}

	//am citit datele
	for(i=0;i<dimens;i++){
		printf("\n");
    	   for(j=0;j<dimens;j++)
			   printf("%d",matrice[i][j]);
	}
	
	p1= &matrice[0][0];



	temp2 = (int*)calloc((dimens)*(dimens),sizeof(int));
		numar = (int**)calloc(dimens, sizeof(int*));

    for(i=0;i<dimens;i++)
		numar[i] = &temp2[i*dimens];//temp[i*(dimens)];

	p2= &numar[0][0];
	nr = nr_1;

	for(i=0;i<dimens;i++)
		for(j=0;j<dimens;j++, p1++,p2++){
			if( *p1 == 0)
				*p2==0;
			else{
				if(i==0 || j==0 )
					(*p2) = (int)(*p1);
				else{
					if(*(p2-dimens-1)==0)
						(*p2) = (int)(*p1);
					else{
						(*p2) = 1;
						for(m=1;m<=*(p2-dimens-1);m++){
							if(*(p1-m) == 1 && *(p1 - dimens*m)==1)
								(*p2)+=1;
							else
								m=1000;
						}
						if(*p2 == max)
							nr+=1;
						if(*p2> max){
							max = *p2;
							nr = 1;
						}
					}
				}
			}
		}
	
		p2= &numar[0][0];

		output=fopen("figuri2.out","w");
		fprintf(output,"%d %d\n\r",max,nr);

		printf("\n %d %d",max,nr);
		printf("\n");
	for(i=0;i<dimens;i++){
		printf("\n");
       for(j=0;j<dimens;j++, p2++)
		   printf("%d",*p2);
	}
	
	p1= &matrice[0][0];
	//p2= &numar[0][0];
	max =1;
	nr =0;
	changed = 1;

	while(changed == 1){
		changed = 0;
		nr_old=nr;
		nr=0;
		p1= &matrice[0][0];

		for(i=0;i<dimens;i++)
			for(j=0;j<dimens;j++, p1++){
				if(i!=0 && j!=0){
					if(*(p1-1) >= max && *(p1+1) >= max && *(p1-dimens) >= max && *(p1+dimens) >= max)
					{
						*p1=max+1;
						nr+=1;
						changed = 1;
					}
				}
			}

			max+=1;
	
	}

	printf("\n %d %d",max-1,nr_old);
	//scriu in fisierul de iesire
	//output=fopen("figuri2.out","w");

	fprintf(output,"%d %d\n",max-1,nr_old);
	fclose(output);

	fclose(output);
	c=(char)0;
	//getchar();
	return 0;
}

*/

#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,*noul;

typedef struct node *N;

void insert(int itprio)
{
	//int item,itprio;
	noul=(struct node *)calloc(1,sizeof(struct node));

	noul->priority=itprio;
	if(start==NULL || itprio<start->priority)
	{
		noul->next=start;
		start=noul;
	}
	else
	{
		q=start;
		while(q->next != NULL && q->next->priority<=itprio)
			q=q->next;
		(noul->next)=(q->next);
		q->next=noul;
	}
}

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

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

void display()
{
	int max =15;
	temp=start;
	if(start==NULL)
		printf("QUEUE IS EMPTY\n");
	else
	{
		printf("QUEUE IS:\n");
		while(temp!=NULL && max-- > 0)
		{
			printf(" [priority=%d]",temp->priority); 
			temp=temp->next;
		}
	}
}

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 alese;

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

	start = NULL;

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

	if(DEBUG)
	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;
	if(DEBUG)printf("incep");
	//inserez primele
	alesi_pe_nivel=0;
	for(i=0;i<nivel&&vec[i].rez==nivel;i++){
		alesi_pe_nivel+=1;
		insert(vec[i].greut);
	}
	
	diferenta =0;
	alese=alesi_pe_nivel;
	//alesi_pealesi_pe_nivel_nivel = nivel;

	for(i=alesi_pe_nivel;i<Nr;i++){
		if(DEBUG)display();
		if(DEBUG)printf("\n-%d-  %d %d\n",i,vec[i].greut,vec[i].rez);
		if(vec[i].rez > nivel){
			if(DEBUG)printf("schimb\n");
			niv_curent = vec[i].rez;
			diferenta = niv_curent - alese;
			nivel=niv_curent;
			//aleg diferenta
			insert(vec[i].greut);
			alese+=1;
			diferenta -=1;
			alesi_pe_nivel =1;
		}else
		{ 
			if(diferenta>0){
				if(DEBUG)printf("dif ok\n");
				insert(vec[i].greut);
				alese+=1;
				diferenta -=1;
				alesi_pe_nivel+=1;
			}
			else
			{   if(DEBUG)printf("inc swap\n");
				if(alesi_pe_nivel < niv_curent){
					if(DEBUG)printf("URA");
					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);
		}
		*/
	output=fopen("gutui.out","w");
	fprintf(output,"%d",diferenta);
	fclose(output);
	//getchar();
	return 0;
}