Cod sursa(job #436759)

Utilizator Mihai_OrtelecanOrtelecan Mihai Alexandru Mihai_Ortelecan Data 8 aprilie 2010 22:40:11
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 1.48 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void adauga_in_vector(int* vector, int size, int val) {

	int i, aux;
	for (i = 0; i < size; i++) {
		if (val >= vector[i]) {
			aux = vector[i];
			vector[i] = val;
			val = aux;
		}
	}
}
int suma_elem_vector(int* vec, int size) {

	int i, rez = 0;
	for (i = 0; i < size; i++) {
		rez += vec[i];
	}
	return rez;
}

int main() {

	FILE * fin = fopen("gutui.in", "r");
	FILE *fout = fopen("gutui.out", "w");

	int nr, h_max, U, i, j, inaltime, greutate, nr_level, *rez, care_level;

	fscanf(fin, "%d", &nr);
	fscanf(fin, "%d", &h_max);
	fscanf(fin, "%d", &U);

	char* alegeri_pe_nivel = (char*) calloc(h_max / U, sizeof(char));
	for (i = 0; i < h_max / U; i++) {
		alegeri_pe_nivel[i] = U - i;
	}
	nr_level = h_max / U;
	rez = (int*) calloc(nr_level,sizeof(int));

	int** Nivel = (int**) calloc(nr_level, sizeof(int*));
	for (i = 0; i < nr_level; i++) {
		Nivel[i] = (int*) calloc(alegeri_pe_nivel[i], sizeof(int));
	}

	for (i = 1; i <= nr; i++) {

		fscanf(fin, "%d", &inaltime);
		fscanf(fin, "%d", &greutate);
		care_level = inaltime / U;
		if (inaltime % U == 0) {
			care_level -= 1;
		}
		adauga_in_vector(Nivel[care_level], alegeri_pe_nivel[inaltime / U],
				greutate);

	}

	for (i = nr_level; i >= 0; i--) {
		for (j = 0; j < alegeri_pe_nivel[i]; j++) {
			if (Nivel[i][j] == 0) {
				break;
			} else {
				adauga_in_vector(rez, alegeri_pe_nivel[i], Nivel[i][j]);
			}
		}
	}
	fprintf(fout,"%d\n", suma_elem_vector(rez, nr_level));

	return 0;
}