Pagini recente » Cod sursa (job #2446600) | Cod sursa (job #900079) | Cod sursa (job #1848494) | Cod sursa (job #2395689) | Cod sursa (job #436130)
Cod sursa(job #436130)
/*
======================== TEMA 1 PA =========================
===Problema 2 - Gutui===
Student : PALITA FLORIAN
GRUPA : 324 CC
=============================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Structura care retine pentru o gutuie inaltimea si greutatea
typedef struct gutui {
int inaltime;
int greutate;
} gutui;
//Structura unui nivel din copac
typedef struct niv {
int greutati[10000];
int lung;
} niv;
int N; //Numarul de gutui
int H; //Inaltimea maxima la care ajunge
int U; //Inaltimea cu care se ridica
FILE *g; //Fisier de iesire
gutui p[100000]; //Vector cu cele N perechi inaltime - greutate
niv nivele[10000]; //Vector cu nivelele gutuiului
int numar_nivele = 0; //Numarul de nivele
int g_gutui[100000]; //Vector cu greutatile gutuilor
int marcaje[100000]; //Vector cu marcaje ( 1-daca gutuia e pe nivelul actual , 0-daca nu )
int n_gutui[100000]; //Vector cu nivelul pe care e gutuia
//Functia de comparare pentru qsort
int compare (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
//Functie pentru preluarea datelor din fisierul de intrare
void input_data() {
FILE *f;
int i, j = 0;
f = fopen("gutui.in", "r");
fscanf(f, "%d %d %d\n", &N, &H, &U);
for (i = 0 ; i < N ; i++) {
fscanf(f, "%d %d\n", &p[i].inaltime, &p[i].greutate);
marcaje[i] = 0;
g_gutui[j] = p[i].greutate;
j++;
}
fclose(f);
}
//Functie ce partitioneaza pe nivele gutuile
void partition() {
int inf, sup, i;
sup = H;
inf = H - U;
while (inf > 0) {
nivele[numar_nivele].lung = 0;
for (i = 0 ; i < N ; i++)
if ((p[i].inaltime > inf) && (p[i].inaltime <= sup)) {
nivele[numar_nivele].greutati[nivele[numar_nivele].lung] = g_gutui[i];
n_gutui[i] = numar_nivele;
nivele[numar_nivele].lung++;
}
numar_nivele++;
sup = inf;
inf = inf - U;
}
if (inf == 0) {
nivele[numar_nivele].lung = 0;
for (i = 0 ; i < N ; i++)
if ((p[i].inaltime > inf) && (p[i].inaltime <= sup)) {
nivele[numar_nivele].greutati[nivele[numar_nivele].lung] = g_gutui[i];
n_gutui[i] = numar_nivele;
nivele[numar_nivele].lung++;
}
numar_nivele++;
}
if (inf < 0) {
nivele[numar_nivele].lung = 0;
for (i = 0 ; i < N ; i++)
if ((p[i].inaltime >= 0) && (p[i].inaltime <= sup)) {
nivele[numar_nivele].greutati[nivele[numar_nivele].lung] = g_gutui[i];
n_gutui[i] = numar_nivele;
nivele[numar_nivele].lung++;
}
numar_nivele++;
}
}
//Functie ce calculeaza maximul greutatii de pe nivelul maxim
int maximNivel() {
int i, max = 0, j;
if (nivele[0].lung == 0)
return 0;
for (i = 0 ; i < nivele[0].lung ; i++)
if (nivele[0].greutati[i] > max)
for (j = 0 ; j < N ; j++)
if ((g_gutui[j] == nivele[0].greutati[i]) && (marcaje[j] == 0) && (n_gutui[j] == 0))
max = nivele[0].greutati[i];
return max;
}
//Functie care sterge primul nivel , dupa culegerea unei gutui
void stergeNivel() {
int i, j;
for (i = 1 ; i < numar_nivele ; i++) {
nivele[i-1].lung = nivele[i].lung;
for (j = 0 ; j < nivele[i-1].lung ; j++)
nivele[i-1].greutati[j] = nivele[i].greutati[j];
}
numar_nivele--;
for (i = 0 ; i < N ; i++)
n_gutui[i]--;
}
int main() {
int i, u = 0, j, contor = 1, nr, inceput = 0;
int culese[100000],ordine[100000];
input_data();
partition();
nr = numar_nivele;
while (numar_nivele > 0) {
//Daca nu e nicio gutuie pe nivel
if (nivele[0].lung == 0)
contor++; //Pot culege inca o gutuie
else {
//Sortez crescator vectorul de gutui de pe nivel
qsort(nivele[0].greutati, nivele[0].lung, sizeof(int), compare);
//Culeg cate gutui am voie si le pun in vectorul culese
inceput = u;
for (i = 0 ; i < contor ; i++) {
if ((nivele[0].lung - i - 1) < 0) {
contor = contor - i + 1;
break;
}
else {
culese[u] = nivele[0].greutati[nivele[0].lung - 1 - i];
ordine[u] = nr - numar_nivele;
u++;
}
}
if (contor == 1) {
j = inceput - 1;
//Cat timp am gutui adaugate de pe nivelul anterior , incerc sa le inlocuiesc
while ((j >= 0) && (ordine[j] == nr - numar_nivele - 1) && ((nivele[0].lung - 1 - i) >= 0)) {
i--;
if (culese[j] <= nivele[0].greutati[nivele[0].lung - 1 - i])
culese[j] = nivele[0].greutati[nivele[0].lung - 1 - i];
else
break;
j--;
}
}
}
stergeNivel();
}
int S = 0;
for (i = 0 ; i < u ; i++)
S += culese[i];
g = fopen("gutui.out", "w");
fprintf(g, "%d\n", S);
fclose(g);
return 0;
}