Cod sursa(job #436341)

Utilizator ion.morozanMorozan Ion ion.morozan Data 8 aprilie 2010 15:13:46
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 2.43 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct furcte{                                          /* stucutra ce contine caractestica unei gutui */
    uint32_t  inaltime;
    uint32_t  greutate;
}fructe;

uint32_t sort_by_inaltime( const void *a, const void *b ){      /* sortarea intregii structurii dupa inaltime */
    fructe *ia = ( fructe * )a;
    fructe *ib = ( fructe * )b;
    
    return ( ib->inaltime - ia->inaltime );                     /* returneaza negativ daca ib > ia si pozitiv daca ia > ib. */
}

uint32_t minimGreutate(uint32_t v[], uint32_t k, uint32_t *poz){/* determina greutatea minima din vectorul de greutatii deja luate in calcul */
    int i=0,min = v[0];
    (*poz) = 0;
    for ( i = 1; i < k; i++ )
        if ( min > v[i]){
            min = v[i];
            (*poz) = i;                                         /* returnez catre program si pozitia pe care se alfa minimul */
        }
return min;
}

void greutateMaxima (fructe *x, FILE* g,uint32_t N, uint32_t H, uint32_t U){/* functie ce intoarce greutatea maxima ce o poate culege Gigel */
     uint32_t k = 0, min = 0, poz = 0, i = 0, masa = 0;
     uint32_t t[100001];

     while ( i < N ){
         if ( (x[i].inaltime + k*U) <= H ){
             masa += t[k] = x[i].greutate;
             k++;
             min = minimGreutate (t,k,&poz);
         }else
             if( (x[i].inaltime + (k-1)*U) <= H && x[i].greutate > min ){
                 masa -= min;
                 masa += t[poz] = x[i].greutate;
                 min = minimGreutate (t,k,&poz);
             }
         i++;
     }
     fprintf(g, "%u", masa);
return;
}

int main(){

    FILE * f = fopen( "gutui.in", "r" );
    FILE * g = fopen( "gutui.out", "w" );
    uint32_t N,H,U,i;
    fructe x[100001];

     if ( f == NULL )                                       /* eroare la deschiderea fisierului */
         perror ("Error opening file");
    else{
         fscanf(f, "%u%u%u", &N, &H, &U  );                 /* nr de gutui, inaltimea maxima, cu cat creste distanta */

         for ( i = 0; i < N; i++){                           /* citirea elementelor structurii => greutatea si inaltimea unde se afla o gutuie */
             fscanf(f, "%u%u", &x[i].inaltime, &x[i].greutate );   
         }
         
         qsort(x, N, sizeof(fructe), sort_by_inaltime);     /* sortez descrescator dupa inaltime */

         greutateMaxima(x,g,N,H,U);
    }

    fclose(f);
    fclose(g);
    return 0;
}