Cod sursa(job #436919)

Utilizator carbonixVictor Carbune carbonix Data 9 aprilie 2010 01:08:52
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 1.41 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#define N 100000

using namespace std;

typedef struct {
	unsigned int w, h, pos;
} quince;

int n, hmax, u;
vector<quince> v, heap;

void read() {
	int i;

	scanf("%d %d %d", &n, &hmax, &u);

	for ( i = 0; i < n; i++ ) {
		quince e;
		scanf("%d %d", &e.h, &e.w);
		e.pos = (hmax - e.h)/u + 1;

		v.insert(v.end(), e);
	}
}

void print() {
	int i;
	
	for ( i = 0; i < v.size(); i++ )
		printf("%d %d %d\n", ((quince) v[i]).h, ((quince) v[i]).w, v[i].pos);
}

bool quinceCmpWeight (const quince q1, const quince q2) {
	if (q1.w < q2.w)
		return true;
	return false;
}

bool quinceCmpHeight (const quince q1, const quince q2) {
	if (q1.pos > q2.pos)
		return true;
	
	return false;
}

void increase_heights() {
	int i;

	for ( i = 0; i < v.size(); i++ )
		v[i].h += u;
}

int main() {
	int minPos, i, gmax = 0;
	freopen("gutui.in", "r", stdin);	
	read();
	sort(v.begin(), v.end(), quinceCmpHeight);
	make_heap(heap.begin(), heap.end(), quinceCmpWeight);

	minPos = v[0].pos;

	do {
		while(v.size() && v[0].pos == minPos) {
			heap.insert(heap.end(), v[0]);
			make_heap(heap.begin(), heap.end(), quinceCmpWeight);	
			
			v.erase(v.begin());
		}

		gmax += heap.front().w;
		
		heap.erase(heap.begin());
		make_heap(heap.begin(), heap.end(), quinceCmpWeight);		
		
		if(v.size())
			minPos = v[0].pos;
		else
			minPos--;	
	} while(minPos);
	
	printf("%d\n", gmax);

	print();
	return 0;
}