Pagini recente » Cod sursa (job #3290071) | Cod sursa (job #7268) | Cod sursa (job #2236933) | Cod sursa (job #2624545) | Cod sursa (job #439939)
Cod sursa(job #439939)
/* Zamfirache Virgil - 323CC
* PA - TEMA 1 - PROBLEMA 2*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <queue>
using namespace std;
//Structura pentru o gutuie
typedef struct gutuie {
unsigned int level; // Nivelul unei gutui ( H - height[ i ] / U )
unsigned int weight; // Greutatea unei gutui
}gutuie;
//Functie comparare pentru qSort (sortare descrescatoare fata de inaltime ) ( crescatoare pe nivele pornind de la cel maxim )
int compare(const void* a,const void* b)
{
if ( ( ( gutuie * ) b ) -> level > ( ( gutuie * ) a ) -> level )
return 1;
if ( ( ( gutuie * ) b ) -> level < ( ( gutuie * ) a ) -> level )
return -1;
return 0;
}
//Functie pentru alegerea gutuilor ce dau profit maxim
void profit_gutui( gutuie *gutui, unsigned int N, unsigned int H, unsigned int U)
{
FILE *out ;
out = fopen ( "gutui.out", "w" );
unsigned int i = 0 , w_max = 0;
//Sortam vectorul de structuri gutui, in functie de greutatea gutuilor, descrescator
qsort( ( void * ) gutui, // Adresa de inceput al vectorului de structuri
N, // Numarul de gutui
sizeof( gutuie ), // Dimensiunea structurii gutuie
compare ); // Pointer la functia de comparare de structuri "gutui"
// Structura auxiliara in care vom adauga gutuile ( ordonare cu greutatea minima la inceput)
priority_queue<unsigned int, std::vector<unsigned int>, std::greater<unsigned int> > aux;
unsigned int lvl = 0 ;
// Parcurgem toate gutuile (sortate descrescator in functie de inaltime )
for ( i = 0 ; i < N ; i ++ ) {
// Daca putem pune gutuia
if ( lvl <= gutui[ i ].level ) {
// Se adauga, se creste nivelul curent si se actualizeaza profitul maxim
aux.push( gutui[ i ].weight) ;
lvl++;
w_max += gutui[ i ].weight;
continue;
}
// Daca gutuia are un nivel mai mic (daca nu se poate lua decat cu conditia:..
if ( lvl > gutui[ i ].level ){
// Daca gutuia curenta are o greutate mai mare decat gutuia cu greutatea cea mai mica din queue
if ( gutui[ i ].weight > aux.top() ) {
// Adaugam gutuia , o scoatem pe cea veche si actualizam profitul maxim
w_max = w_max - aux.top() + gutui [ i ].weight ;
aux.pop();
aux.push( gutui[ i ].weight );
continue;
}
}
}
// Scriere rezultat in fisierul de iesire
fprintf ( out , "%d", w_max);
fclose ( out ) ;
}
//Functie de citire din fisier in vectorul de structuri gutui
void read( char *fname , gutuie **gutui, unsigned int *N, unsigned int *H, unsigned int *U )
{
FILE *in ;
unsigned int i;
in = fopen ( fname, "r" );
unsigned int haux;
fscanf(in, "%d", N);
fscanf(in, "%d", H);
fscanf(in, "%d", U);
//Aloca vectorul de structuri gutui si citeste din fisier
*gutui = ( gutuie * )calloc( ( * N ), sizeof( gutuie));
for ( i = 0; i < *N ; i++) {
// Citire inaltime gutuie: i si salvarea nivelului gutuii relativ la inaltimea maxima ( H )
fscanf ( in, "%d", &haux );
( *gutui)[ i ].level = ( *H - haux )/ *U;
// Citire greutate gutuie: i
fscanf ( in, "%d", & ( ( *gutui)[ i ].weight ));
}
fclose ( in );
}
int main()
{
gutuie *gutui;
/*
N (numarul de gutui din copac),
H (inaltimea maxima la care ajunge Gigel) si
U (cu cat se ridica crengile copacului dupa culegerea unei gutui).*/
unsigned int N, H, U ;
char in_name[ ] = "gutui.in";
read( in_name, &gutui , &N, &H, &U );
profit_gutui( gutui, N, H, U);
return 0;
}