Pagini recente » Cod sursa (job #3300908) | Cod sursa (job #477880) | Cod sursa (job #436182) | Cod sursa (job #1514520) | Cod sursa (job #436341)
Cod sursa(job #436341)
#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;
}