Cod sursa(job #437237)

Utilizator MariaPOPMaria Popoviciu MariaPOP Data 9 aprilie 2010 15:18:19
Problema Gutui Scor 10
Compilator c Status done
Runda teme_upb Marime 3.79 kb
#include <stdio.h>
#include <malloc.h>

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

int N,H,U,GG;

// 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 scrierea solutiei in fisierul gutui.out
 
void writef()
{
     FILE *f;
     f=fopen(fout,"wb");
     fprintf(f,"%d",GG);
     fclose(f);
     } 

// Functie de sortare

void sort(int p, int q, int *ph, int *pg){
     int aux;
     if(pg[p]<pg[q]){
                   aux=pg[p];
                   pg[p]=pg[q];
                   pg[q]=aux;
                   aux=ph[p];
                   ph[p]=ph[q];
                   ph[q]=aux;
                   }
}

//Functie de interclasare

void interc(int p, int q, int m, int *ph, int *pg){
     int *b,i,j,k;
     b=(int *)malloc(N*sizeof(int));
     i=p; 
     j=m+1; 
     k=1; 
     while((i<=m) && (j<=q))
     if(pg[i] >= pg[j]){
                    b[k]=pg[i];
                    i=i+1;
                    k=k+1;
                    }
     else {
          b[k]=pg[j];
          j=j+1;
          k=k+1;
          }
     if(i<=m)
     for(j=i; j<=m; j++){
              b[k]=pg[j];
              k=k+1;
              }
     else 
     for(i=j; j<=q; j++){
              b[k]=pg[i];
              k=k+1;
              }
     k=1; 
     for(i=p; i<=q; i++){
              pg[i]=b[k];
              k=k+1;
              } 
}

// Functie de sortare ......................
              
void sortd(int p, int q, int *ph, int *pg){
     int m;
     if((q-p)<=1) sort(p,q,ph,pg);
     else {
          m=(p+q)/2; 
          sortd(p,m,ph,pg);
          sortd(m+1,q,ph,pg);
          interc(p,q,m,ph,pg);
          }
     }
     
// Initializare vector la adresa p cu 0

void init(int *p)
{
     int i;
     for(i=0;i<N;i++)
     *(p+i)=0;
     }

// Functie pentru constructia vectorului nivelelor
// gutuilor    

void nivele(int *ph, int *nivel)
{
     int i,j;
     for(i=0;i<N;i++)
     *(nivel+i)=(H+U-*(ph+i))/U;
     //*(nivel+i)=(H-*(ph+i))/10+1;
     for(i=0;i<N;i++)
     {
     j=0;
     while(j<i)
     {
     if(*(nivel+i)==*(nivel+j))
     {
     *(nivel+i)-=1;
     j=0;
     }
     else j++;
     }} 
}   
// Functie pentru culegere gutui

int culeg(int *p, int *vmase)
{
    int i,masa;
    for(masa=0,i=0;i<N;i++)
    if(*(p+i)>0)
    masa+=*(vmase+i);
    return masa;
}


// n = numar de gutui din copac
// H = inaltimea la care poate ajunge culegatorul
// U = inaltimea cu care se ridica crengile dupa culegerea unei gutui
// vg = pointer catre vectorul maselor gutuilor
// vh = pointer catre vectorul inaltimilor la care se afla initial gutuile
// GG = masa totala a gutuilor culese
         
int main()
{
    //int N=4,H=100,U=10;
    //int hg[4]={91,82,93,94}, mg[4]={10,30,5,15};
    //int N=6,H=100,U=10;
    //int hg[6]={71,72,73,82,91,92}, mg[6]={20,30,30,5,15,25};
    //int N=9,H=100,U=10;
    //int hg[9]={40,20,70,80,50,30,60,30,50}, mg[9]={2,1,1,3,1,2,3,2,2};
    int *vh,*vg,*nivel;
    readn();
    vh=(int *)malloc(N*sizeof(int));
    vg=(int *)malloc(N*sizeof(int));
    nivel=(int *)malloc(N*sizeof(int));
    readf(vg,vh);
    sortd(0,N-1,vh,vg);
    init(nivel);
    nivele(vh,nivel);
    GG=culeg(nivel,vg);
    //printf(" Masa totala este %d \n",GG);
    writef();
    //system("pause");
    //return 0;
}