Cod sursa(job #438434)

Utilizator ion.morozanMorozan Ion ion.morozan Data 10 aprilie 2010 19:19:34
Problema Gutui Scor 100
Compilator c Status done
Runda teme_upb Marime 3.53 kb
#include <stdio.h>
#include <stdlib.h>
#define  MAX -1

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

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

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

void greutateMaxima (fructe *x,unsigned int N, unsigned int H, unsigned int U){ /* functie ce intoarce greutatea maxima ce o poate culege Gigel */
     unsigned int level = 0, min = 0, poz = 0, i = 0, masa = 0;
     unsigned int t[100001];                                                       /* vector ce contie toate greutatile alese la un pas "level" */
     FILE * g = fopen( "gutui.out", "w" );

     while ( i < N ){
         x[i].inaltime += level*U;
         if ( x[i].inaltime <= H ){                                             /* daca elemntul de pe poz "i" se incadreaza in distanta maxima admisa */
             masa += t[level] = x[i].greutate;                                  /* adauga la "masa" greutatea si o memorez in vectorul de gerutatii */
             level++;                                                           /* incrementez pasul de crestere */
             min = minimGreutate (t,level, &poz);                               /* determin minimul din vectorul de greutati adaugate la masa + pozitia lui */
         }else  /* daca nu se incadreaza */
             if( x[i].greutate > min ){                                         /* atunci poate gasesc o gutuie din acelasi interval cu o greutate mai buna */
                 masa -= min;                                                   /* scad din masa valoarea cu cea mai mica greutate din vectorul t */
                 masa += t[poz] = x[i].greutate;                                /* apoi adaug la masa o valoarea mai buna decat cea minima  */
                 min = minimGreutate (t,level, &poz);                           /* determin minimul din vectorul de greutati adaugate la masa + pozitia lui */
                 
             }
         i++;
     }
     fprintf(g, "%u", masa);
     fclose(g);
return;
}

int main(){
    FILE * f = fopen( "gutui.in", "r" );
    unsigned int 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,N,H,U);
    }

    fclose(f);                                              /* inchiderea fisierelor */
    return 0;
}