Cod sursa(job #440968)

Utilizator lili_bililili bili lili_bili Data 12 aprilie 2010 18:22:19
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.29 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++) 
   	{
             // inaltimea si greutatea gutuilor le bag intr-un vector
             fscanf (f, "%d", &v[i].inaltime);
             fscanf (f, "%d", &v[i].greutate);
             
    }
	fclose(f);
	
}
void print_file (const char *fis , int greutate_maxima)
{
     

    // date_gutui gutui;
     f = fopen(fis, "w");
     fprintf (f, "%d ", N);
     fprintf (f, "%d ", H);
     fprintf (f, "%d\n", U);
     
     fprintf (f, "%d", greutate_maxima);
     fclose(f);
    
     
}

int alegNivel() // impart gutuiul in nivele
{
     printf("Am %d gutui\n",N);
     int i, min = 10000;
     int max = -10000;
     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;
        for (j=1; j<H/U; j++) // 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
                }
                v[i].nivel --; // trec la urmatorul nivel
                
            }    
            if (maxim > -1000)
            {
               v[k].cules = 1; // culeg gutuia
               greutate_maxima += maxim; // adaug la greutatea maxima greutatea gutuii culese 
            }
            
        }
    
    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;
}