Pagini recente » Istoria paginii runda/tomberonulverde/clasament | Cod sursa (job #1837000) | Cod sursa (job #1875264) | Cod sursa (job #1755704) | Cod sursa (job #1007307)
#include <iostream>
#include <fstream>
#include <math.h>
#define nmax 5000
struct ob{
int greutate, valoare;
float raport;
}ob1;
ob heap[nmax];
int nrObiecte, N, G, gCurenta = 0,
vCurenta = 0;
std::fstream in, out;
void swap(ob &a, ob &b){
ob c = a;
a = b;
b = c;
}
void upHeap(int k){
if (k / 2 && heap[k / 2].raport < heap[k].raport){
swap(heap[k], heap[k / 2]);
upHeap(k / 2);
}
}
void downHeap(int k){
if (2 * k <= nrObiecte)
{
int max = 2 * k;
if (2 * k + 1 <= nrObiecte && heap[2 * k + 1].raport > heap[2 * k].raport)
max = 2 * k + 1;
if (heap[k].raport < heap [max].raport)
{
swap (heap [k], heap [max]);
downHeap (max);
}
}
}
int main(){
in.open("rucsac.in", std::ios::in);
out.open("rucsac.out", std::ios::out);
in >> N >> G;
for (int i = 1; i <= N; i++){
in >> ob1.greutate >> ob1.valoare;
ob1.raport = (float)ob1.valoare / (float)ob1.greutate;
heap[++nrObiecte] = ob1;
}
for (int i = N; i >= 1; i--){
downHeap(i);
}
for(int i = 0; gCurenta + heap[1].greutate <= G; i++){
gCurenta += heap[1].greutate;
vCurenta += heap[1].valoare;
swap(heap[1], heap[nrObiecte--]);
downHeap(1);
}
if (gCurenta < G){
int auxG = G - gCurenta;
vCurenta += auxG * heap[1].raport;
}
std::cout << "Val:" << vCurenta << std::endl;
in.close();
out.close();
return 0;
}