티스토리 뷰

https://www.acmicpc.net/problem/23559

 

23559번: 밥

제주대 학생회관 식당에는 두 개의 메뉴가 있다. 코너 A로 가면 5,000원짜리 메뉴를 먹을 수 있고, 코너 B로 가면 1,000원짜리 메뉴를 먹을 수 있다. 준원이는 대면 수업이 시작되는 바람에 이제 남

www.acmicpc.net

class PriorityQueue {
	constructor(callback) {
		this.heap = [];
		this.callback = callback;
	}

	swap(a, b) {
		const temp = { ...this.heap[a] };
		this.heap[a] = this.heap[b];
		this.heap[b] = temp;
	}

	size() {
		return this.heap.length;
	}

	getParentIndex(cur) {
		return Math.floor((cur - 1) / 2);
	}

	push(value) {
		this.heap.push(value);
		let current = this.size() - 1;
		let parent = this.getParentIndex(current);

		while (parent >= 0 && this.callback(value, this.heap[parent])) {
			this.swap(parent, current);
			current = parent;
			parent = this.getParentIndex(current);
		}
	}

	pop() {
		const last = this.size() - 1;
		let current = 0;
		this.swap(current, last);
		const value = this.heap.pop();

		while (current < last) {
			const left = current * 2 + 1;
			const right = current * 2 + 2;

			if (left >= last) {
				break;
			} else if (right >= last) {
				if (this.callback(this.heap[left], this.heap[current])) {
					this.swap(current, left);
					current = left;
				} else {
					break;
				}
			} else {
				if (
					this.callback(this.heap[left], this.heap[current]) ||
					this.callback(this.heap[right], this.heap[current])
				) {
					const next = this.callback(this.heap[left], this.heap[right]) ? left : right;
					this.swap(current, next);
					current = next;
				} else {
					break;
				}
			}
		}
		return value;
	}
}

const [[N, X], ...BOB] = require('fs')
	.readFileSync('./dev/stdin')
	.toString()
	.trim()
	.split('\n')
	.map((v) => v.split(' ').map(Number));

const callback = (a, b) => {
	const diffA = Math.abs(a.A - a.B);
	const diffB = Math.abs(b.A - b.B);

	if (diffA > diffB) return true;
	else if (diffA < diffB) return false;
	else {
		if (a.A > b.A) return true;
		else return false;
	}
};

class Menu {
	constructor(a, b) {
		this.A = a;
		this.B = b;
	}
}

const pq = new PriorityQueue(callback);
BOB.forEach((v) => {
	const menu = new Menu(v[0], v[1]);
	pq.push(menu);
});

let DON = X / 1000;
let answer = 0;
while (pq.size() > 0) {
	const { A, B } = pq.pop();
	if (A - B > 0) {
		if (DON >= 5 && DON - 5 >= pq.size()) {
			answer += A;
			DON -= 5;
		} else {
			answer += B;
			DON -= 1;
		}
	} else {
		answer += B;
		DON -= 1;
	}
}
console.log(answer);
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함