Pagini recente » NoGcd | Istoria paginii problema/joculet | Cod sursa (job #2533539) | Profil STEFAN-ZOTA | Cod sursa (job #438434)
Cod sursa(job #438434)
#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;
}