Cod sursa(job #436830)

Utilizator Mihai_OrtelecanOrtelecan Mihai Alexandru Mihai_Ortelecan Data 8 aprilie 2010 23:51:22
Problema Gutui Scor 30
Compilator c Status done
Runda teme_upb Marime 1.63 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);

	nr_level = h_max / U;
	if (h_max % U != 0) {
		nr_level++;
	}

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

	rez = (int*) calloc(nr_level, sizeof(int));

	int** Nivel = (int**) calloc(nr_level, 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;
		}
		if (mem_aloc[care_level] == 0) {
			Nivel[care_level] = (int*) calloc(alegeri_pe_nivel[care_level], sizeof(int));
			mem_aloc[care_level] = 1;
		}
		adauga_in_vector(Nivel[care_level], alegeri_pe_nivel[care_level],
				greutate);
	}

	for (i = nr_level - 1; i >= 0; i--) {
		for (j = 0; j < alegeri_pe_nivel[i]; j++) {
			if (mem_aloc[i] == 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;
}