Pagini recente » Borderou de evaluare (job #441236) | Cod sursa (job #216227) | Borderou de evaluare (job #3197927) | Istoria paginii utilizator/bloodman104 | Cod sursa (job #438924)
Cod sursa(job #438924)
/* gutui.c*/
#include <unistd.h> /* pentru open(), exit() */
#include <errno.h> /* perror() */
#include <stdlib.h>
#include <stdio.h>
#define INF 32000
#define MAX(a,b) ((a)>(b) ? (a) : (b))
#define MIN(a,b) ((a)<(b) ? (a) : (b))
void fatal(char * mesaj_eroare)
{
perror(mesaj_eroare);
exit(1);
}
typedef struct gutuia {
int greutate;
int inaltime;
} Tgutuie, *Agutuie;
Tgutuie gutui[100000];
Tgutuie mergeaux[100000];
int N,H,U;
int n;
static void ReadFile()
{
FILE *file_in= fopen("gutui.in", "r");
int copiat;
/*citim N (numarul de gutui din copac)*/
if(!file_in) printf("avem o mare problema\n");
copiat=fscanf(file_in, "%i",&N);
if(!copiat) fatal("eroare la citire N din fisier");
/* H (inaltimea maxima la care ajunge Gigel)*/
copiat=fscanf(file_in, "%i",&H);
if(!copiat) fatal("eroare la citire H din fisier");
/*U (cu cat se ridica crengile copacului dupa culegerea unei gutui)*/
copiat=fscanf(file_in, "%i",&U);
if(!copiat) fatal("eroare la citire U din fisier");
int i,g,h;
for(i=0;i<N;){
copiat=fscanf(file_in, "%i",&h);
if(!copiat) fatal("eroare la citire inaltime din fisier");
copiat=fscanf(file_in, "%i",&g);
if(!copiat) fatal("eroare la citire greutate din fisier");
if((H-h)/U+1>0)
{
gutui[i].inaltime=(H-h)/U+1;
gutui[i].greutate=g;
i++;
}
}
n=i;
fclose(file_in);
}
int compare_by_height_and_weight (const void * a, const void * b)
{
if(((Tgutuie *)b)->inaltime == ((Tgutuie *)a)->inaltime)
return ( ((Tgutuie *)b)->greutate - ((Tgutuie *)a)->greutate );
return ( ((Tgutuie *)b)->inaltime - ((Tgutuie *)a)->inaltime );
}
static int alegere_gutui(Agutuie gutui)
{
qsort (gutui, n, sizeof(Tgutuie), compare_by_height_and_weight);
long greutate=0;
Agutuie p,q,aux;
int i;
//pregatire date pas initial
p=gutui;
q=gutui;
while(q->inaltime==p->inaltime&& q-gutui<n) q++;
while(q-gutui<n){
//fructe ce vor fi culese
for(i=0;i<(p->inaltime-q->inaltime);i++){
greutate+=p->greutate;
p++;
}
aux=p;
//pregatirea date pentru pasul urmator
while(aux<q) {aux->inaltime=q->inaltime; printf("%i?",q-gutui); aux++;}
if(q-p>(p->inaltime)){
memcpy ((void*)(q- (p->inaltime)), (const void*)p, p->inaltime*sizeof(Tgutuie));
p=q-p->inaltime;}
while(q->inaltime==p->inaltime&& q-gutui<n&& (q-aux)<p->inaltime) q++;
qsort (p, q-p, sizeof(Tgutuie), compare_by_height_and_weight);
// merge(p,i,aux,q-aux);
}
//culegerea ultimelor fructe
for(i=0;i<p->inaltime;i++){
greutate+=p->greutate;
p++;
}
return greutate;
}
int main(void)
{
ReadFile();
FILE *file_out= fopen("gutui.out", "w");
fprintf(file_out,"%i\n",alegere_gutui(gutui));
fclose(file_out);
return 0;
}