Cod sursa(job #441552)

Utilizator zdocAnghel Dan-Adrian zdoc Data 12 aprilie 2010 23:11:34
Problema Gutui Scor 10
Compilator cpp Status done
Runda teme_upb Marime 3.59 kb
#include <stdio.h>
#include <stdlib.h>

FILE *f;
int N, H, U, greutate_maxima = 0;
// N -numarul de gutui din copac
//H-inaltimea maxima la care ajunge Gigel 
//U-cu cat se ridica crengile copacului dupa culegerea unei gutui
//greutate_maxima -greutatea maxima a gutuilor pe care le poate culege Gigel
typedef struct gutui
{
        int inaltime;// inaltimea si greutatea gutuilor din copac
        int greutate;  
        int nivel ; // impart gutuiul in nivele in functie de inaltimea gutuilor fata de sol 
        int cules; //poate fi zero sau unu    
        
}date_gutui;

date_gutui v[100000]; // vector in care retin inaltimea si greutatea gutuilor


void read_file (const char *fis)
{
    int i;
    //date_gutui gutui;
    
    f = fopen (fis, "r");
    fscanf (f, "%d", &N); // numarul de gutui din copac
    fscanf (f, "%d", &H); // inaltimea maxima la care ajunge Gigel 
    fscanf (f, "%d", &U); // cu cat se ridica crengile copacului dupa culegerea unei gutui
    
    // pe urmatirele N linii ale fisierului sunt date referitoare la inaltimea si greutatea gutuilor din copac
   	
    for(i=0; i<N; i++) 
   	{

             fscanf (f, "%d", &v[i].inaltime);
             fscanf (f, "%d", &v[i].greutate);
             
    }
	fclose(f);
	
}
void print_file (const char *fis , int greutate_maxima)
{
     

    
     f = fopen(fis, "w");
     
     fprintf (f, "%d", greutate_maxima);
     fclose(f);
    
     
}

void alegNivel() // impart gutuiul in nivele
{
     //printf("Am %d gutui\n",N);
     int i;
     
     //int niv = 0;
     for (i=0; i<N; i++)
     {
         v[i].nivel = (H - v[i].inaltime)/U + 1; // impart gutuiul in nivele
        
                      
        //printf("numarul de niveluri ale gutuiului este : ");      
       // printf("%d\n", v[i].nivel); 
             
     }
   
     
  
}
int culegGutui ()
{
    int i, j, maxim = -1000, k=0;
    int nr=0; //numarul de nivele in care n-am ales nici o gutuie;
        for (j=1; j<=H/U;) // parcurg gutuiul nivel cu nivel
        {
           
            maxim = -1000;
            for (i=0; i<N; i++) // parcurg numarul de gutui
            {
                if (v[i].nivel > 0 && v[i].nivel <= j && v[i].greutate > maxim && v[i].cules == 0) // variabila cules poate fi 0 sau 1 , si-mi indica daca am cules sau nu gutuia
                {
                   maxim = v[i].greutate; // am aflat gutuia cu greutatea maxima
                   k = i; // in k retin indicele
                }
                
                
                
            }   
            for (i=0;i<N;i++)
                if (v[i].nivel > 0 && v[i].nivel <= j && v[i].greutate == maxim && v[i].cules == 0 && v[i].nivel < v[k].nivel)
                   k = i; 
            if (maxim > -1000)
            {
               v[k].cules = 1; // culeg gutuia
               greutate_maxima += maxim; // adaug la greutatea maxima greutatea gutuii culese 
               if (nr == 0)
                  for (i=0;i<N;i++)
                       v[i].nivel --; // trec la urmatorul nivel
               else
                   nr--;
            }
            else
            {
                j++;
                nr++;
            }
            
        }
    
   // printf ("greutatea maxima este : \n");
   // printf("%d\n", greutate_maxima); 

   
   return greutate_maxima; 
}


int main()
{
    
    //int i;
    read_file("gutui.in");
    alegNivel();
    printf("\n");
    culegGutui();
    print_file("gutui.out", greutate_maxima);
    //getchar();
    return 0;
}