Pagini recente » Cod sursa (job #51345) | Cod sursa (job #2792690) | Cod sursa (job #1655751) | Cod sursa (job #672521) | Cod sursa (job #443044)
Cod sursa(job #443044)
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
int n,h,u;
typedef struct
{
int lvl;
int g;
} gutuie;
gutuie *a;
int condsort (const void * x, const void * y)
{
gutuie *a= (gutuie *) x;
gutuie *b= (gutuie *) y;
if (a->lvl < b->lvl) return -1;
else if(a->lvl > b->lvl) return 1;
else if( a->g > b->g) return -1;
else return 1;
}
int main()
{
FILE *f;
int i,ha,niv,j, lvlmax=0,s=0,counter, elem, k,valid,rem=0, o=0;
int **lista ; //vector de pointeri
f= fopen("gutui.in", "r");
fscanf (f, "%i %i %i",&n,&h,&u);
a = (gutuie*)malloc(n*sizeof(gutuie));
for(i=0;i<n;i++)
{
fscanf (f, "%i %i",&ha,&a[i].g);
a[i].lvl= (h - ha)/ u ;
if ( ha > h ) { i--; n--; }
if ( a[i].lvl >= lvlmax ) lvlmax=a[i].lvl+1;
}
fclose(f);
qsort (a, n, sizeof(gutuie), condsort);
lista= (int **)malloc(lvlmax*sizeof(int *));
niv=0; j=0;
lista[0]=(int *) malloc(1*sizeof(int));
for (i=0;i<n;i++)
if(niv == a[i].lvl )
{ lista[niv][j]= (int ) malloc(1*sizeof(int)); lista[niv][j++]=a[i].g;}
else{
lista[niv][j]= (int ) malloc(1*sizeof(int));
lista[niv][j]=-1;
niv++; j=0;
lista[niv]=malloc (1*sizeof(int));
//lista[niv][j++]=a[i].g;
i--;
}
lista[niv][j]= (int ) malloc(1*sizeof(int));
lista[niv][j]=-1;
f=fopen("gutui.out", "w");
j=lvlmax;
niv=0;
elem=lista[niv][0];
while(j!=1)
{
counter=0;
valid=1;
for(k=0,i=niv+1;i<lvlmax;)
{
if(elem < lista[i][k++] )
{
counter++;
if(counter > i-niv+rem) { o=0; niv++; rem++; valid=0; elem=lista[niv][0]; break; }
}
else { i++; k=0; }
}
if (valid)
{
s+=elem; j--; //fprintf(f,"%i ",elem);
if(rem) { rem--; elem=lista[niv][++o]; }
else { niv++; o=0; elem=lista[niv][0]; }
}
}
//fprintf(f,"%i\n\n",elem);
s+=elem;
/*for (i=0,k=0; i<lvlmax;)
{
if(lista[i][k] >= 0)
fprintf(f,"%i ",lista[i][k++]);
else { i++; k=0; fprintf(f,"\n");}
}*/
fprintf(f,"%i",s);
fclose(f);
free(a);
free(lista);
//getch();
return 0;
}