Pagini recente » Cod sursa (job #1758825) | Cod sursa (job #723346) | Cod sursa (job #2088146) | Cod sursa (job #1860254) | Cod sursa (job #436235)
Cod sursa(job #436235)
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int inaltime_gutuie;
int greutate_gutuie;
}gutuie;
int compare_inaltime(const void* a,const void *b)
{
gutuie *ia = (gutuie *)a;
gutuie *ib = (gutuie *)b;
return (ib->inaltime_gutuie - ia->inaltime_gutuie);
}
int main()
{
FILE *fin = fopen("gutui.in","r");
FILE *fout = fopen("gutui.out","w");
gutuie g[100000];
gutuie aux;
int nr_gutui,inaltime_maxima,inaltime_crengi,insemnat[100000],t;
int i,ok,j,greutate_maxima=0,inceput;
fscanf(fin,"%d",&nr_gutui);
fscanf(fin,"%d",&inaltime_maxima);
fscanf(fin,"%d",&inaltime_crengi);
for(i=0;i<nr_gutui;i++)
{
fscanf(fin,"%d",&g[i].inaltime_gutuie);
fscanf(fin,"%d",&g[i].greutate_gutuie);
}
printf("%d %d %d\n",nr_gutui,inaltime_maxima,inaltime_crengi);
for(i=0;i<nr_gutui;i++)
printf("%d %d\n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
printf("\n");
/*facem sortarea dupa inaltime*/
qsort(g,nr_gutui,sizeof(gutuie),compare_inaltime);
for(i=0;i<nr_gutui;i++)
printf("%d %d\n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
printf("\n");
/*facem sortarea dupa greutate*/
i=1;
while(i<nr_gutui)
{
if (g[i].inaltime_gutuie/10 == g[i-1].inaltime_gutuie/10)
{
inceput=i-1;
while(g[i].inaltime_gutuie/10 == g[i-1].inaltime_gutuie/10 && i<nr_gutui)
i++;
do{
ok=0;
for(j=inceput;j<=i-2;j++)
{
if (g[j].greutate_gutuie<g[j+1].greutate_gutuie)
{
aux = g[j];
g[j] = g[j+1];
g[j+1] = aux;
ok=1;
}
}
}while(ok);
}
else{
i++;}
}
for(i=0;i<nr_gutui;i++)
printf("%d %d\n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
for(i=0;i<nr_gutui;i++)
insemnat[i]=0;//nu s-a luat nicio gutuie de la aceasta inaltime
for(i=0;i<nr_gutui;i++)
{
if(g[i].inaltime_gutuie<inaltime_maxima&&insemnat[i]==0)
{
greutate_maxima+=g[i].greutate_gutuie;
insemnat[i]=1;
for(j=0;j<nr_gutui;j++)
g[j].inaltime_gutuie+=inaltime_crengi;
printf("greutate_maxima1 %d\n",greutate_maxima);
}
j=i;
if(g[i].inaltime_gutuie==inaltime_maxima&&insemnat[i]==0)
{
//a doua inaltime este si ea maxima
while(g[j+1].inaltime_gutuie==inaltime_maxima)
{
j++;
}
if(j<nr_gutui-2)
{
/*trebuie verificat daca urmatoarea inaltime este mai mica decat inaltimea maxima-inaltime crengi*/
if(g[j+1].inaltime_gutuie<inaltime_maxima-inaltime_crengi)
{
greutate_maxima+=g[i].greutate_gutuie;
insemnat[i]=1;
}
/*trebuie verificat daca urmatoarele inaltimi sunt mai mari decat inaltimea maxima-inaltime crengi*/
if(g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima)
{
if(g[j+1].greutate_gutuie>g[i].greutate_gutuie)
{
if(g[j+2].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+2].inaltime_gutuie<inaltime_maxima)
{
if(g[j+2].greutate_gutuie>g[i].greutate_gutuie)
{
greutate_maxima+=g[j+1].greutate_gutuie;
insemnat[j+1]=1;//s-a luat gutuia de la aceasta inaltime
}
if(g[j+2].greutate_gutuie<=g[i].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
insemnat[i]=1;
}
}//g[j+2]
}//g[j+1]>
if(g[j+1].greutate_gutuie<=g[i].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
insemnat[i]=1;
}//g[j+1]<
}//g[j+1]
}//j<nr_gutui-2
if(j>=nr_gutui-2)
{
greutate_maxima+=g[i].greutate_gutuie;
insemnat[i]=1;
}
for(t=0;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
}//g[i]==inaltime_maxima
}//for
printf("%d ",greutate_maxima);
fprintf(fout,"%d\n",greutate_maxima);
fclose(fout);
fclose(fin);
return 0;
}