Pagini recente » Cod sursa (job #3220423) | Cod sursa (job #437225) | Cod sursa (job #2862200) | Cod sursa (job #2463425) | Cod sursa (job #429867)
Cod sursa(job #429867)
#include <stdio.h>
#include <stdlib.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,j;
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); //aloca memorie pentru variabila de cules (1 daca e culeasa)
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;
greutate_max = 0;
int found = 1;
while(found == 1) {
found = 0;
int pos = -1;
int max = -1;
for(i=0;i<N;i++) {
if(cules[i] == 0 && height[i] <= H && height[i]+U > H && weight[i] > max) {
found = 1;
max = weight[i];
pos = i;
}
}
if(pos == -1) {
for(i=0;i<N;i++) {
if(cules[i] == 0 && height[i] <= H && weight[i] > max) {
found = 1;
max = weight[i];
pos = i;
}
}
}
if(pos != -1) {
greutate_max += max;
cules[pos] = 1;
for(i=0;i<N;i++) {
height[i] += U;
}
}
}
}
//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;
}