Cod sursa(job #430206)

Utilizator tester123David Plopescu tester123 Data 30 martie 2010 20:27:59
Problema Gutui Scor 20
Compilator c Status done
Runda teme_upb Marime 3.33 kb
#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;
}