Cod sursa(job #430463)

Utilizator Cristina_89Cristina Savin Cristina_89 Data 31 martie 2010 02:00:06
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 3.25 kb
#include <stdio.h>
#include <stdlib.h>


#define MAXINTER (h-1)/u+1

int *hh,*gg,*cap_inter;
int n,h,u,crt;
int minPoz,maxPoz;
int *sol;
int pozSol=0;

void quicksort(int *prim,int *sec,int st, int dr)
{
int i,j;
int v,t;
if ( dr>st )
{
	v=prim[dr]; i=st-1; j=dr; /*indice=ultimul element */
	for ( ; ; )
	{
		while ( prim[++i]>v );
		while ( prim[--j]<v );
		if (i>=j) break;
		t=prim[i];prim[i]=prim[j];prim[j]=t;
		if (sec) {t=sec[i];sec[i]=sec[j];sec[j]=t;} 
	}
	t=prim[i];prim[i]=prim[dr];prim[dr]=t;
	if (sec) {t=sec[i];sec[i]=sec[dr];sec[dr]=t;}
	quicksort(prim,sec,st,i-1);
	quicksort(prim,sec,i+1,dr);
}
}

/*
int maxim(int pasi)
{
    int ok=0,max=-1,poz=-1,i;
    for (i=crt;i>=0;i--)
        if (!pus[i] && (hh[i]+u*pasi)<=h)
        {  
           ok=1;
           if (hh[i]+u*(pasi+1)<=h) break;
           else 
                if (gg[i]>max) {max=gg[i];poz=i;}
        }
    if (!ok) return -1;
    if (poz==-1) poz=i;
    crt=i;
    pus[poz]=1;
	
	printf("Aleg gg=%d\n",gg[poz]);
	return gg[poz];    
}
*/

void afla_intervale()
{
	//aici e cu hh-1, daca se vrea ca 90 sa fie in intervalul de sub el
	int i;
	maxPoz=(hh[0]-1)/u;
	for (i=0;i<n;i++)
	{ 
		if (cap_inter[2*((hh[i]-1)/u)]==-1) cap_inter[2*((hh[i]-1)/u)]=i; //pozitia din stanga a intervalului
		cap_inter[2*((hh[i]-1)/u)+1]=i;  //pozitia din dreapta a intervalului	
	}
	minPoz=(hh[n-1]-1)/u;
}  

void sorteaza_intervale()
{
	int i;
	for (i=maxPoz;i>=minPoz;i--)
	{
		quicksort(gg,hh,cap_inter[2*i],cap_inter[2*i+1]);
		printf("###%d:\t%d %d###\n",MAXINTER-i,cap_inter[2*i],cap_inter[2*i+1]);
	}
}

int minim_lung(int i)
{
	if ((MAXINTER-i)<(cap_inter[2*i+1]-cap_inter[2*i]+1)) return MAXINTER-i;
	else return (cap_inter[2*i+1]-cap_inter[2*i]+1);
}
    
void construieste_solutia()
{
	int i,j;
	//din intervalul i tb sa alex maxim h/u-i numere
	for (i=maxPoz;i>=minPoz;i--)
	{		
		for (j=cap_inter[2*i];j<cap_inter[2*i]+minim_lung(i);j++)
		{
			sol[pozSol++]=gg[j];
			printf("Aleg pozitia %d cu gg=%d\n",j,gg[j]);
			if (pozSol==MAXINTER-i) break;//am pus de ajuns
		}
		
		//Depaseste timp
		//quicksort(sol,NULL,0,pozSol-1);
		
		for (j=j+1;j<cap_inter[2*i]+minim_lung(i);j++)
		{
			if (sol[pozSol-1]<gg[j]) 
				{
				sol[pozSol-1]=gg[j];
				printf("Aleg pozitia %d cu gg=%d\n",j,gg[j]);
				//Depaseste timp
				quicksort(sol,NULL,0,pozSol-1);
				}
		}				
	}
	
}	
	
int main()
{
    int i,sum;
    FILE *fis=fopen("gutui.in","r");
    fscanf(fis,"%d%d%d",&n,&h,&u);

    hh=(int*)malloc(n*sizeof(int));
    gg=(int*)malloc(n*sizeof(int));
	sol=(int*)malloc(n*sizeof(int));
    cap_inter=(int*)malloc(2*(h/u+2)*sizeof(int));
    
    for(i=0;i<n;i++)
       {fscanf(fis,"%d%d",&hh[i],&gg[i]);}
    fclose(fis);
	
	for(i=0;i<2*(h/u+2);i++)
		cap_inter[i]=-1;
    
    quicksort(hh,gg,0,n-1);
    
	afla_intervale();
	sorteaza_intervale();	
	
	construieste_solutia();
	
	for(i=0;i<n;i++)
		printf("hh[%d]=%d gg[%d]=%d\n",i,gg[i],i,hh[i]);
	
	sum=0;
	
	for(i=0;i<pozSol;i++)
		{
			printf("%d ",sol[i]);
			sum+=sol[i];
		}	
	printf("\n");
    FILE *fis1=fopen("gutui.out","w");
    fprintf(fis1,"%d\n",sum);
    printf("Suma totala=%d\n",sum);
    fclose(fis1);
    
    return 0;   
}