Cod sursa(job #438924)

Utilizator melania.patruPatru Melania melania.patru Data 11 aprilie 2010 04:00:51
Problema Gutui Scor 20
Compilator c Status done
Runda teme_upb Marime 3.31 kb
/* gutui.c*/

#include <unistd.h> /* pentru open(), exit() */
#include <errno.h> /* perror() */
#include <stdlib.h>
#include <stdio.h>


#define INF 32000
#define MAX(a,b) ((a)>(b) ? (a) : (b))
#define MIN(a,b) ((a)<(b) ? (a) : (b))

void fatal(char * mesaj_eroare)
{
     perror(mesaj_eroare);
     exit(1);
}

typedef struct gutuia {
                int greutate;     
                int inaltime;   
               
} Tgutuie, *Agutuie;

Tgutuie  gutui[100000];
Tgutuie  mergeaux[100000];
int N,H,U;
int n;


static void ReadFile()
{
     FILE *file_in= fopen("gutui.in", "r");
     int copiat;
     /*citim N (numarul de gutui din copac)*/
     if(!file_in) printf("avem o mare problema\n");
   
     copiat=fscanf(file_in, "%i",&N);
     if(!copiat)  fatal("eroare la citire N din fisier"); 
  
     /* H (inaltimea maxima la care ajunge Gigel)*/ 
     
     copiat=fscanf(file_in, "%i",&H);
     if(!copiat)  fatal("eroare la citire H din fisier"); 
   
      /*U  (cu cat se ridica crengile copacului dupa culegerea unei gutui)*/
     copiat=fscanf(file_in, "%i",&U);
     if(!copiat)  fatal("eroare la citire U din fisier"); 
   
     
     int i,g,h;
     for(i=0;i<N;){
     
            copiat=fscanf(file_in, "%i",&h);
            if(!copiat)  fatal("eroare la citire inaltime din fisier");
            copiat=fscanf(file_in, "%i",&g);
            if(!copiat)  fatal("eroare la citire greutate din fisier");
            if((H-h)/U+1>0)
            {
            gutui[i].inaltime=(H-h)/U+1;
            gutui[i].greutate=g;
            i++;
            }
                                  
     }
     n=i;
     fclose(file_in);
       
}


int compare_by_height_and_weight (const void * a, const void * b)
{
  if(((Tgutuie *)b)->inaltime == ((Tgutuie *)a)->inaltime)
  return ( ((Tgutuie *)b)->greutate - ((Tgutuie *)a)->greutate );
  return ( ((Tgutuie *)b)->inaltime - ((Tgutuie *)a)->inaltime );
}


static int alegere_gutui(Agutuie gutui)
{
 
 qsort (gutui, n, sizeof(Tgutuie), compare_by_height_and_weight);  
 long greutate=0;
 Agutuie p,q,aux;
 int i;
 
 //pregatire date pas initial
 p=gutui;
 q=gutui;
 while(q->inaltime==p->inaltime&& q-gutui<n) q++;
 
 while(q-gutui<n){
         
         //fructe ce vor fi culese 
         for(i=0;i<(p->inaltime-q->inaltime);i++){
             greutate+=p->greutate;
             p++;
         }
         aux=p;
        
        //pregatirea date pentru pasul urmator
         
         while(aux<q) {aux->inaltime=q->inaltime; printf("%i?",q-gutui); aux++;} 
         if(q-p>(p->inaltime)){
                               memcpy ((void*)(q- (p->inaltime)), (const void*)p, p->inaltime*sizeof(Tgutuie)); 
                               p=q-p->inaltime;}     
         while(q->inaltime==p->inaltime&& q-gutui<n&& (q-aux)<p->inaltime) q++;
         qsort (p, q-p, sizeof(Tgutuie), compare_by_height_and_weight);
        // merge(p,i,aux,q-aux);
         
         
      
 }
 //culegerea ultimelor fructe
 for(i=0;i<p->inaltime;i++){
             greutate+=p->greutate;
             p++;
 }

 return greutate; 
 
 
}

int main(void)
{
    ReadFile();
    FILE *file_out= fopen("gutui.out", "w");
    fprintf(file_out,"%i\n",alegere_gutui(gutui));
    fclose(file_out);
    return 0;
}