Cod sursa(job #435837)

Utilizator MariaPOPMaria Popoviciu MariaPOP Data 7 aprilie 2010 21:54:53
Problema Gutui Scor 20
Compilator c Status done
Runda teme_upb Marime 3.96 kb
#include <stdio.h>
#include <malloc.h>

const char *fin="gutui.in";
const char *fout="gutui.out";

int N,H,U,GG,indice;

// Functie pentru citire si validare numarului de gutui N

void readn()
{
     FILE *f;
     f=fopen(fin,"r");
     fscanf(f,"%d %d %d",&N,&H,&U);
     fclose(f);
     
     }

// Functie pentru citirea din fisierul gutui.in a vectorilor inaltimilor si
// greutatilor 

void readf(int *pg,int *ph)
{
     FILE *f;
     int i,j;
     f=fopen(fin,"r");
     fscanf(f,"%d %d %d",&N,&i,&j);
     for(i=0;i<N;i++)
     fscanf(f,"%d %d",ph+i,pg+i);
     fclose(f);
     }

  
  // Functie pentru determinarea gutuii care urmeaza a fi culeasa
// exist = 1 daca inaltimea la care se va afla gutuia i depaseste pe H

int max1(int *p,int *h, int *g)//gasim greutatile
{
    int i,max;
    i=0;
    while(*(p+i) == -1)
    i++;
    max=*(g+i); //prima val diferita de -1 din culese
    indice=i;
    for(i=0;i<N;i++)
    if(max<*(g+i) && *(h+i)+U>H && *(p+i)!=-1)
    {
    max=*(g+i);
    indice=i;
    }
    return max;
}

int max2(int *p,int *h, int *g)//gasim inaltimile maxime
{
    int i,max;
    i=0;
    while(*(p+i) == -1)
    i++;
    max=*(g+i); //am inlocuit h cu g
    indice=i;
    for(i=0;i<N;i++) //gasim maximul dintre inaltimi
    {
    if(max<*(g+i) && *(p+i)!=-1)
    {
    max=*(g+i);
    indice=i;
    }
    }
    max=*(g+indice);
    return max;
}

// Functie pentu initializare cu 0 a vectorului culese
void init(int  *p)
{
     int i;
     for(i=0;i<N;i++)
     *(p+i)=0;
     }

// Functie pentru actualizarea vectorului culese
void ramase(int *p, int *h)
{
     int i;
     for(i=0;i<N;i++)
     if(*(h+i)>H)
     *(p+i)=-1;
     }

// Functie pentru determinarea numarului de gutui care pot fi culese
int testculese(int *p)
{
     int i,decules=0;
     for(i=0;i<N;i++)
     if(*(p+i)!= -1)
     decules++;
     return decules;
     }

// Functie pentru actualizarea vectorului culese
void update(int *p)
{
     *(p+indice)=-1;
     }
    
// Functie pentru actualizarea inaltimilor 
void updateh(int *p, int *h)
{
     int i;
     for(i=0;i<N;i++)
     if(*(p+i)!=-1)
     *(h+i)+=U;
     }
           

   
// Functie pentru rezolvarea problemei gutuilor
// hg este vectorul inaltimilor
// mg este vectorul maselor
// masa = masa curenta a gutuilor culese
// cules = vectorul care are pe pozitia i valoarea 0 daca gutuia i poate 
//          fi culeasa ( se afla la o inaltime mai mica decat H)
//          si are valoarea -1 daca gutuia de pe pozitia i ori se afla la
//          o inaltime mai mare decat H, ori a fost culeasa 
int gutui(int *mg, int *hg)
{
    
    int *cules;
    GG=0;
    cules=(int *)malloc(N*sizeof(int));
    init(cules); //vector culese este 0
    ramase(cules,hg);//cate gutui mai pot fi culese 
    //printf(" Mai sunt %d gutui \n",testculese(cules));
    GG+=max1(cules, hg, mg);
    while(testculese(cules))
    {
    GG+= max2(cules,hg,mg);
    update(cules);
    updateh(cules,hg);
    ramase(cules,hg);
    //printf(" Se culege gutuia %d \n Masa totala %d \n",indice,GG);
    //printf(" Mai sunt %d gutui \n",testculese(cules));
    //for(i=0;i<N;i++)
    //printf(" cules[%d] = %d \n",i,*(cules+i));
        }
return GG;
}

// Functie pentru scrierea solutiei in fisierul gutui.out
 
void writef()
{
     FILE *f;
     f=fopen(fout,"w");
     fprintf(f,"%d",GG);
     fclose(f);
     } 
     
// n = numar de gutui din copac
// H = inaltimea la care poate ajunge culegatorul
// U = inaltimea cu care se ridica crengile dupa culegerea unei gutui
// pg = pointer catre vectorul maselor gutuilor
// ph = pointer catre vectorul inaltimilor la care se afla initial gutuile
// GG = masa totala a gutuilor culese
      
int main()
{
    int *pg,*ph;
    readn(); 
    pg=(int *)malloc(N*sizeof(int));
    ph=(int *)malloc(N*sizeof(int));
    readf(pg,ph);
    GG=gutui(pg,ph);
    writef();
    return 0;
   
}