Pagini recente » Cod sursa (job #1912952) | Cod sursa (job #1200751) | Cod sursa (job #3176404) | Cod sursa (job #2947167) | Cod sursa (job #463388)
Cod sursa(job #463388)
//Popescu Mihai 321 CA -- Tema 1 PA -- Problema Gutui -- Limbaj: C++ -- Compilator: g++
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <functional>
#include <cstdlib>
using namespace std;
//o gutuie cu inaltime si greutate
class Gutuie{
public:
int greutate;
int inaltime;
};
//functie de compare care reprezinta criteriul dupa care se realizeaza sortarea vectorului. In cazul de fata descrescator in functie de inaltime
bool compare(const Gutuie& g1,const Gutuie& g2){
if(g1.inaltime != g2.inaltime)
return g1.inaltime > g2.inaltime;
else
return g1.greutate > g2.greutate;
}
int main(){
ifstream fin("gutui.in");
ofstream fout("gutui.out");
int n,h,u;
//citim N,H,U
fin>>n;
fin>>h;
fin>>u;
//declaram un vector de gutui
vector<Gutuie> v;
vector<int> kg;
//variabile ajutatoare
int i,caz,contor;
//citim parametrii gutuilor si le introducem in vector
for(i = 0; i < n; i++){
Gutuie g;
fin>>g.inaltime;
fin>>g.greutate;
v.push_back(g);
}
//sortam vectorul
std::sort(v.begin(),v.end(),compare);
//Pentru fiecare gutuie
for(i = 0; i < n; i++){
caz = 0;
contor = 0;
//Daca gutuia poate fi culeasa , introducem greutatea ei in kg, care reprezinta un heap minimal pentru a avea evidenta celei mai mici gutui culese.Caz = 1 -> suntem pe prima situatie.Contor = 1 -> marcam gutuia ca fiind culeasa pt a nu se intersecta cu al doilea caz.
if(v[i].inaltime <= h)
{
kg.push_back(v[i].greutate);
push_heap(kg.begin(),kg.end(),greater<int>());
caz = 1;
contor = 1;
}
if(v[i].inaltime - u <= h && i!=0 && v[i].greutate > kg[0] && contor == 0 && (int)kg.size() > 0)
{
//Al doilea caz: daca am ratat gutuia la o culegere, din cauza ca la aceeasi inaltime se afla alta mai grea si din cauza inaltarii copacului culegerea ambelor ar fi imposibila in acest pas, compar cu greutatea din varful heapului iar daca gutuia curenta este mai grea decat cea mai usoara gutuie culeasa, o inlocuiesc pe aceasta din urma cu cea curenta pentru a obtine greutatea optima.In acest caz nu mai inalt copacul,doar in cazul precedent.
pop_heap(kg.begin(),kg.end(),greater<int>());//pop_heap nu sterge efectiv doar muta primul element la sfarsit
kg.pop_back();//execut efectiv stergerea
kg.push_back(v[i].greutate);//introduc greutatea curenta
push_heap(kg.begin(),kg.end(),greater<int>());//refac proprietea heapului
}
//daca suntem in primul caz..scad inaltimea copacului cu u (in loc sa maresc inaltimea fiecarei gutui cu u
if(caz == 1){
h = h- u;
}
}
int s = 0;
//calculez suma greutatilor culese
for(i = 0; i < (int)kg.size(); i++){
s = s + kg[i];
}
fout<<s;
fin.close();
fout.close();
return 0;
}