Pagini recente » Cod sursa (job #1122611) | Clasamentul arhivei de probleme | Cod sursa (job #2673523) | Cod sursa (job #1684905) | Cod sursa (job #430214)
Cod sursa(job #430214)
#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* pasi;
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);
pasi = (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," "));
pasi[i] = 0;
cules[i] = 0;
}
fclose(in); //inchide fisierul
}
//calculeaza valorile dorite (greutatea maxima a gutuilor culese)
void calculeaza()
{
greutate_max = 0;
int i,j,k;
for(i=0;i<N-1;i++) {
for(j=i+1;j<N;j++) {
if(weight[j] > weight[i] || (weight[j] == weight[i] && height[j] < height[i])) {
int aux = weight[j];
weight[j] = weight[i];
weight[i] = aux;
aux = height[j];
height[j] = height[i];
height[i] = aux;
}
}
}
for(i=0;i<N;i++) {
pasi[i] = (H-height[i])/U+1;
}
int found = 1;
while(found == 1) {
found = 0;
for(j=0;j<N;j++) {
if(cules[j] == 0 && pasi[j] > 0) {
int pas = pasi[j];
int depl = 0;
if(pas == 1) {
cules[j] = 1;
greutate_max += weight[j];
found = 1;
} else {
for(k=j+1;k<N;k++) {
if(cules[k] == 0 && pasi[k] > 0) {
depl++;
if(depl >= pasi[k]-1) {
cules[k] = 1;
greutate_max += weight[k];
found = 1;
break;
}
}
}
if(found == 0) {
cules[j] = 1;
greutate_max += weight[j];
found = 1;
}
}
break;
}
}
for(k=0;k<N;k++) {
pasi[k]--;
}
}
}
//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;
}