Cod sursa(job #443053)

Utilizator DmanBlanda Alexandru Dman Data 15 aprilie 2010 22:20:37
Problema Gutui Scor 30
Compilator cpp Status done
Runda teme_upb Marime 3.09 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct structura
{
        long w;//greutate
        long h;//inaltime
        long mark;
        long cules;
} gutuie;

int Compara(const void* a, const void* b)//crescator dupa inaltime,altfel descrescator dupa greutate
{ 
  if (((gutuie*)a)->h == ((gutuie*)b)->h) return (((gutuie*)b)->w - ((gutuie*)a)->w);
                      else return (((gutuie*)a)->h - ((gutuie*)b)->h);
}
int Compara2(const void* a, const void* b)//descrescator dupa greutate
{ 
  
   return (((gutuie*)b)->w - ((gutuie*)a)->w);
}	 

int main()
{
  
  long n, ho,u;//numar de gutui,inaltime maxima,pas de crestere a inaltimii
  long i,j,count=0,suma=0,stop=0,liber;
  FILE *f,*g;
  
  f = fopen("gutui.in", "rt");
  g = fopen("gutui.out", "w");
  if ((!f) ||(!g))
  { printf("Eroare deschidere fisiere\n");
    return -1;
  }
  
  fscanf(f, "%ld %ld %ld", &n,&ho,&u);//se citesc: numar de gutui,inaltime maxima,pas de crestere a inaltimii
  gutuie gutui[n];//vector de gutui
  
  //se citesc inaltimea si greutatea gutuilor si se introduc in vectorul de gutui
  for (i=0;i<n;i++)
  {
  fscanf(f, "%ld %ld", &gutui[i].h,&gutui[i].w);
  gutui[i].cules=0;
  gutui[i].mark=0;
  }
  fclose(f);
  
  
  qsort(gutui,n,sizeof(gutuie),Compara);//sortare crescatoare dupa inaltime

  long top;
  long offset = ho % u;
  if (offset == u) top = 0;
  else top = offset - u;
  gutuie vector[n];
  
  //se construieste un vector de gutui de n elemente, cu structuri de tip gutuie care au initializate toate campurile cu 0
  for (i=0;i<n;i++)
  {
   vector[i].w=0;
   vector[i].h=0;
   vector[i].mark=0;
   vector[i].cules=0;   
  }
  
  while (top <= ho)
  {     
        liber=0;
        for (i=0;i<n;i++)
        {   
            
            if (gutui[i].h>top) break;//daca se depaseste nivelul curent
            if (gutui[i].mark!=1)//daca nu a fost introdusa anterior in vector
            {
            vector[count].w=gutui[i].w;//introduc in vectorul de gutui construit pana la momentul respectiv
            vector[count].h=gutui[i].h;
            gutui[i].mark=1;//se marcheaza faptul ca s-a introdus gutuia in vector
            count++;//se incrementeaza numarul de gutui introduse in vector
            liber=1;
            }       
        }    
        //daca s-au introdus noi gutui in vector sau daca s-au introdus toate gutuile dar top nu a ajuns inca la inaltimea maxima
        if ((liber==1)||(count==n))
        {
        qsort(vector,n,sizeof(gutuie),Compara2);//sortez vectorul descrescator dupa greutate
        
        
        for (j=0;j<n;j++)//caut in vector cel mai greu fruct necules
         {
        if (vector[j].cules != 1)//daca nu a fost cules 
          {
            suma+=vector[j].w;//adaug la suma primul element necules(vectorul este sortat dupa greutate)
            vector[j].cules=1;//se marcheaza ca fiind cules
            break;
           }
         }
        }    
        top+=u;//se trece la nivelul urmator
  }
  
  fprintf(g,"%ld\n",suma);
  fclose(g); 
  return 0;
}