Pagini recente » Cod sursa (job #1223841) | Cod sursa (job #2303363) | Cod sursa (job #1042661) | Cod sursa (job #2355588) | Cod sursa (job #429897)
Cod sursa(job #429897)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int N; //numarul de gutui din copac
int H; //inaltimea maxima la care ajunge Gigel
int U; //cu cat se ridica crengile copacului dupa culegerea unei gutui
int* height; //inaltimile
int* weight; //greutatile gutuilor
int* cules;
int greutate_max; //greutatea maxima a gutuilor culese
//citeste din fisier matricea de 0/1
void citeste(char* nume_fisier)
{
int i;
char line[512]; //retine o linie citita
FILE* in = fopen(nume_fisier,"r"); //deschide fisier
if(in == NULL) { //daca nu s-a putut deschide fisierul afiseaza eroare
printf("Fisierul de intrare nu a putut fi gasit\n");
exit(1);
}
fgets(line,512,in); //citeste prima linie
N = atoi((char*)strtok(line," ")); //retine numarul de gutui din copac
H = atoi((char*)strtok(NULL," ")); //retine inaltimea maxima la care ajunge Gigel
U = atoi((char*)strtok(NULL," ")); //retine cu cat se ridica crengile copacului dupa culegerea unei gutui
height = (int*)malloc(sizeof(int)*N); //aloca memorie pentru matrice
weight = (int*)malloc(sizeof(int)*N); //aloca memorie pentru matricea rezultat
cules = (int*)malloc(sizeof(int)*N);
for(i=0;i<N;i++) { //pentru fiecare linie
fgets(line,512,in); //citeste linia
height[i] = atoi((char*)strtok(line," "));
weight[i] = atoi((char*)strtok(NULL," "));
cules[i] = 0;
}
fclose(in); //inchide fisierul
}
//calculeaza valorile dorite (greutatea maxima a gutuilor culese)
void calculeaza()
{
int i,j,k;
greutate_max = 0;
for(i=0;i<=H;i+=U) {
int max = -1;
int pos = -1;
for(j=0;j<N;j++) {
if(cules[j] == 0 && height[j] >= i && height[j] < i+U && weight[j] > max) {
max = weight[j];
pos = j;
}
}
if(max != -1) {
cules[pos] = 1;
greutate_max += max;
} else {
for(k=i-1;k>=0;k-=U) {
for(j=0;j<N;j++) {
if(cules[j] == 0 && height[j] >= k && height[j] < k+U && weight[j] > max) {
max = weight[j];
pos = j;
}
}
if(max != -1) {
cules[pos] = 1;
greutate_max += max;
break;
}
}
}
}
}
//scrie rezultatele in fisierul de iesire
void scrie(char* nume_fisier)
{
FILE* out = fopen(nume_fisier,"w"); //deschide fisier
fprintf(out,"%i",greutate_max); //scrie greutatea maxima
fclose(out); //inchide fisier
}
int main(int argc,char** argv)
{
citeste("gutui.in"); //citeste matricea din fisier
calculeaza(); //calculeaza valorile dorite
scrie("gutui.out"); //scrie rezultatele in fisier
return 0;
}