Pagini recente » Cod sursa (job #2731638) | Cod sursa (job #2569930) | Cod sursa (job #191577) | Cod sursa (job #1499992) | Cod sursa (job #438792)
Cod sursa(job #438792)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
unsigned int h; //inaltimea crengii pe care se afla gutuia
unsigned int g; //greutatea gutuii
} gutuie;
int compara(void* a,void* b)
{
unsigned int val_a,val_b,vala,valb;
val_a=(*((gutuie *)a)).h;
val_b=(*((gutuie *)b)).h;
vala=(*((gutuie *)a)).g;
valb=(*((gutuie *)b)).g;
if(vala<valb)
return 1;
else
if(vala>valb)
return -1;
else
{
if(val_a<val_b)
return 1;
else
if(val_a>val_b)
return -1;
else
return 0;
}
}
int main()
{
//deschidere fisier de intrare, respectiv fisier de iesire
FILE *in,*out;
in=fopen("gutui.in","r");
out=fopen("gutui.out","w");
//citim numarul de gutui, inaltimea maxima si cu cat se ridica crengile
int N,H,U;
fscanf(in,"%d%d%d",&N,&H,&U);
unsigned int *ridicari,*nivele;
gutuie *date;
date=(gutuie*) calloc(N,sizeof(gutuie));
int i,k,m=0,j=0;
unsigned int nr_max_gutui;
ridicari = (unsigned int *) calloc(N,sizeof (unsigned int));
nivele = (unsigned int *) calloc(N+1,sizeof (unsigned int));
//citim datele despre fiecare creanga
for(i=0;i<N;i++)
fscanf(in,"%u%u",&date[i].h,&date[i].g);
qsort(date,N,sizeof(gutuie),(__compar_fn_t)&compara);
for(i=1;i<=N;i++)
nivele[i]=0;
// for(i=0;i<N;i++)
// printf("%u %u\n",date[i].h,date[i].g);
unsigned int minim=date[0].h;
for(i=1;i<N;i++)
if(date[i].h<minim)
minim=date[i].h;
//printf("%u\n",minim);
nr_max_gutui=(H-minim)/U + 1; //cate gutui ar putea fi maxim culese a.i. sa se respecte conditiile
// printf ("%d \n", nr_max_gutui);
int culese=0;
unsigned int suma=0;
for (i=0;i<N;i++)
{ if (date[i].h<=H)
ridicari[i]=(H-date[i].h)/U +1;
if (date[i].h>H)
ridicari[i]=0;}
//for (i=0;i<N;i++)
// printf("%d ", ridicari[i]);
//printf("\n");
/*if (nr_max_gutui==N)
for (i=0;i<N;i++)
suma=suma+date[i].g;
else*/
for(i=0;i<N;i++)
{
m=(H-date[i].h)/U+1;
if (m>0)
if (culese<nr_max_gutui)
if(nivele[m]<m+1) //poate fi culeasa in conditiile date
{
suma+=date[i].g;
culese++;
nivele[m]++;
}}
/*for(i=0;i<N;i++)
{
m=ridicari[i]-1;
if (culese<nr_max_gutui)
if(nivele[m]!=ridicari[i]&&ridicari[i]>0) //poate fi culeasa in conditiile date
{
suma+=date[i].g;
culese++;
nivele[ridicari[i]-1]++;
}}
/* if ((H-minim)%U==0)
for(i=j+1;i<N;i++)
{ if (date[i].h==minim)
{suma+=date[i].g; break;}
}
else
for(i=j+1;i<N;i++)
{m=ridicari[i]-1;
if(nivele[m]!=ridicari[i]&&ridicari[i]>0)
{suma+=date[i].g; break;}}*/
/*if ((H-minim)%U==0)
if (date[j].h!=minim && nr_max_gutui>1)
{suma=suma-date[j].g;
for(i=j+1;i<N;i++)
if (date[i].h==minim)
{suma+=date[i].g; break;}*/
//}
//printf("\n");
// for (i=1;i<=N;i++)
// printf("%d ", nivele[i]);
fprintf(out,"%u\n",suma);
free(date);
fclose(in);
fclose(out);
return 0;
}