Cod sursa(job #436235)

Utilizator elena.cavalCaval Elena elena.caval Data 8 aprilie 2010 13:03:23
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 4.57 kb
#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;
}