Cod sursa(job #435360)

Utilizator elena.cavalCaval Elena elena.caval Data 7 aprilie 2010 12:41:37
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 7.04 kb
#include<stdio.h>
#include<stdlib.h>

typedef struct gutuie{
	int inaltime_gutuie;
	int greutate_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 compare_greutate(const void *a,const void *b)
{
    gutuie *ia = (gutuie *)a;
    gutuie *ib = (gutuie *)b;
    return (ib->greutate_gutuie - ia->greutate_gutuie);
}

int main()
{
    FILE *fin = fopen("gutui.in","r");
	FILE *fout = fopen("gutui.out","w");
	gutuie g[10000];
	gutuie aux;
	int nr_gutui,inaltime_maxima,inaltime_crengi;
	int i,ok,tmp,j,greutate_maxima=0,inceput,t,t1,t2;
	int inaltime_gutuie[10000],greutate_gutuie[10000];
	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);
	}
		//afisare inainte de sortare
		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");
        qsort(g,nr_gutui,sizeof(gutuie),compare_inaltime);
        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");


	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++;
//        qsort(g,i,sizeof(gutuie),compare_greutate);
		//acum facem sortarea dupa greutate
			do{
				ok=0;
				for(j=inceput;j<=i-2;j++)
				{
					if (g[j].greutate_gutuie<g[j+1].greutate_gutuie)
					{
						/*aux = g[j].greutate_gutuie; tmp = g[j].inaltime_gutuie;
						g[j].greutate_gutuie = g[j+1].greutate_gutuie; g[j].inaltime_gutuie = g[j+1].inaltime_gutuie;
						g[j+1].greutate_gutuie = aux; g[j+1].inaltime_gutuie = tmp;*/
						aux = g[j];
						g[j] = g[j+1];
						g[j+1] = aux;
						ok=1;
					}
				}
			 }while(ok);
		}
		else{
			i++;}

	}
	//qsort(g,nr_gutui,sizeof(gutuie),compare_inaltime);
        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");
    //parcurgem toate gutuile
    while(i<nr_gutui)
    {
        //cazul controversat
        if(g[i].inaltime_gutuie == inaltime_maxima)
        {
            j=i+1;
            if(j<nr_gutui)
            {
                if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie>g[i].greutate_gutuie)
                {
                    if(g[j+1].greutate_gutuie>g[i].greutate_gutuie)
                    {
                        greutate_maxima+=g[j].greutate_gutuie;
                        //trecut=1;
                        for(t=j+1;t<nr_gutui;t++)
                            g[t].inaltime_gutuie+=inaltime_crengi;
                        i=j+1;

                    }
                    if(g[j+1].greutate_gutuie<g[i].greutate_gutuie)
                    {
                        greutate_maxima+=g[i].greutate_gutuie;
                        for(t=i+1;t<nr_gutui;t++)
                            g[t].inaltime_gutuie+=inaltime_crengi;
                        i=i+1;
                    }

                }
                if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie<g[i].greutate_gutuie)
                {
                    greutate_maxima+=g[i].greutate_gutuie;
                    for(t=i+1;t<nr_gutui;t++)
                        g[t].inaltime_gutuie+=inaltime_crengi;
                    i=i+1;
                }
                if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_crengi&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie==g[i].greutate_gutuie)
                {
                    if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie>g[i+1].greutate_gutuie)
                    {
                        greutate_maxima+=g[j].greutate_gutuie;
                        for(t=j+1;t<nr_gutui;t++)
                            g[t].inaltime_gutuie+=inaltime_crengi;
                        i=j+1;
                    }
                    if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie<g[i+1].greutate_gutuie)
                    {
                        greutate_maxima+=g[i].greutate_gutuie;
                        for(t=i+1;t<nr_gutui;t++)
                            g[t].inaltime_gutuie+=inaltime_crengi;
                        i=i+1;
                    }
                    if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie==g[i+1].greutate_gutuie)
                    {
                        t1=i+2;
                        t2=j+2;
                        do{
                            if(g[t1].greutate_gutuie>g[t2].greutate_gutuie)
                            {
                                greutate_maxima+=g[i].greutate_gutuie;
                                for(t=i+1;t<nr_gutui;t++)
                                    g[t].inaltime_gutuie+=inaltime_crengi;
                                i=i+1;
                            }
                            if(g[t2].greutate_gutuie<=g[t1].greutate_gutuie)
                            {
                                greutate_maxima+=g[j].greutate_gutuie;
                                for(t=j+1;t<nr_gutui;t++)
                                    g[t].inaltime_gutuie+=inaltime_crengi;
                                i=j+1;
                            }
                            t1++;
                            t2++;
                        }while(g[t1].inaltime_gutuie!=inaltime_maxima);
                    }
                }
                if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie<inaltime_maxima-inaltime_crengi)
                {
                    greutate_maxima+=g[i].greutate_gutuie;
                    for(t=i+1;t<nr_gutui;t++)
                        g[t].inaltime_gutuie+=inaltime_crengi;
                    i=i+1;
                }

            }
        }
        if(g[i].inaltime_gutuie<inaltime_maxima)
        {
            greutate_maxima+=g[i].greutate_gutuie;
            for(t=i+1;t<nr_gutui;t++)
                g[t].inaltime_gutuie+=inaltime_crengi;
            i++;
        }

    }
        printf("%d",greutate_maxima);
        fprintf(fout,"%d\n",greutate_maxima);
        fclose(fout);
        fclose(fin);
    return 0;
}