Cod sursa(job #437854)

Utilizator MariaPOPMaria Popoviciu MariaPOP Data 10 aprilie 2010 09:30:51
Problema Gutui Scor 60
Compilator c Status done
Runda teme_upb Marime 4.6 kb
#include <stdio.h>
#include <malloc.h>

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

int N,H,U,GG;
int *pg, *ph;

// 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,"w");
     fprintf(f,"%d",GG);
     fclose(f);
     } 
 

void q_sort(int numbers[],int v[], int left, int right)
{
  int pivot,pivot1, l_hold, r_hold;
 
  l_hold = left;
  r_hold = right;
  pivot = numbers[left];
  pivot1 = v[left];
  while (left < right)//
  {
    while ((numbers[right] >= pivot) && (left < right)) //
      right--;
    if (left != right)
    {
      numbers[left] = numbers[right];
      v[left] = v[right];
      left++;
    }
    while ((numbers[left] <= pivot) && (left < right)) 
      left++;
    if (left != right)
    {
      numbers[right] = numbers[left];
      v[right] = v[left];
      right--;
    }
  }
  numbers[left] = pivot;
  v[left] = pivot1;
  pivot = left;
  pivot1 = left;
  left = l_hold;
  right = r_hold;
  if (left < pivot) //
    q_sort(numbers,v, left, pivot-1);
  if (right > pivot) //
    q_sort(numbers,v, pivot+1, right);
}
 

void quickSort(int numbers[],int v[], int array_size)
{
  q_sort(numbers,v, 0, array_size - 1);
}
 
  
 /*
     
     // Functia pentru Shell Sort
// Consideram salt[] ca fiind vectorul cu cele mai bun numar de comparatii.
// nit este dimensiunea vectorului salt
 void shell_sort(int v[], int vp[], int n)
 {
 int salt[8]={701,301,132,57,23,10,4,1};//aceasta este cea mai buna secventa pentru vectorul de salturi
 int nit=10;
 int i,j,aux,auxp,k;
 for(k=nit-1; k>=0; k--){
 for(i=salt[k];i<=n-1; i++) {
 aux=v[i];
 auxp=vp[i];
 j=i-salt[k];
 while((j>=0)&&(v[j]<aux)){
 v[j+salt[k]]=v[j];
 vp[j+salt[k]]=vp[j];
 j=j-salt[k];
 }
 v[j+salt[k]]=aux;
 vp[j+salt[k]]=auxp;
 }
 }
 }          
*/

// 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++)
     for(i=0;i<N; i++)
     *(nivel+i)=(H+U-*(ph+i))/U;
     for(i=N-1;i>=0; i--)
     //for(i=0;i<N;i++)
     {
     j=N;//j=0; 
     while(i<j)//while(j<i)
     {
     if(*(nivel+i)==*(nivel+j))
     {
     *(nivel+i)-=1;
     j=N;//j=0;
     }
     else j--;//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
 
void afis(int *p, int n, char c)
{
     int i;
     for(i=0;i<n;i++)
     printf(" %c [ %d ] = %d \n",c,i,*(p+i));
     }
              
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 *nivel;
    readn();
    ph=(int *)malloc(N*sizeof(int));
    pg=(int *)malloc(N*sizeof(int));
    nivel=(int *)malloc(N*sizeof(int));
    readf(pg,ph);
    //printf(" Vector greutati nesortat \n");
    //system("pause");
    //afis(pg,N,'G');
    //printf("\n\n");
    //printf(" Vector inaltimi nesortat \n");
    //system("pause");
    //afis(ph,N,'H');
    //system("pause");
    //printf("\n\n");
    //shell_sort(pg,ph,N);
    quickSort(pg,ph,N);
    //printf(" Vectori sortati \n");
    //afis(pg,N,'G');
    //printf("\n\n");
    //afis(ph,N,'H');
    //printf("\n\n");
    init(nivel);
    nivele(ph,nivel);
    //afis(nivel,N,'N');
    GG=culeg(nivel,pg);
    //printf(" Masa totala este %d \n",GG);
    //system("pause");
    writef();
    return 0;
}