알고리즘

[C++] 백준 13323번 BOJ 수열 1

J3SUNG 2020. 3. 22. 21:07
728x90

우선순위 큐로 문제를 풀었습니다.

A수열이 주어졌을때 오름차순의 B수열로
[B1-A1]....[Bn-An]의 값을 최소화 하는 문제입니다.

우선순위 큐에 A수열의 값을 넣습니다.
넣을 때 왼쪽에 있는 수의 개수만큼 빼서 넣어줍니다.
그리고 현재 뺀 값이 우선순위큐의 top보다 작으면,
top - 현재 값의 차를 결과값에 추가해줍니다.

#include <iostream>
#include <queue>
using namespace std;

int main(int argc, char *argv[]) {
	int n;
	int num;
	long long result = 0;
	priority_queue<int> pq;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> num; 
		num -= i; 
		pq.push(num);

		if (!pq.empty() && pq.top() > num) {
			result += pq.top() - num;
			pq.pop(); 
			pq.push(num);
		}
	}
	cout << result << endl;

	return 0;
}