[UCPC][2019][예선] B번 풀이

less than 1 minute read

풀이

문제의 조건에 따라서 m의 최대값은 15,000입니다. n의 최대값에 대한 1000에 대한 정렬의 시간 복잡도는 $nlogn 1000 * log(1000) = 3000$입니다.

매번 카드 합체를 진행할 때마다 정렬을 진행하면, 15000 * 3000 = 45,000,000이므로 1초 이상의 시간이 소요되는 것으로 생각됩니다.

때문에 priority_queue를 이용해서 전체 정렬을 하지 않고 푸는 방법을 생각해야 합니다.

priority_queue를 사용하는 방법은 구사과님의 블로그를 보고 따로 정리해봤습니다. 여기

코드

#include <vector>
#include <cstdio>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

priority_queue<long long, vector<long long>, greater<long long> > pq;

int n, m;
long long t;
int main(void) {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++) {
		scanf("%d", &t);
		pq.push(t);
	}

	for (int j = 0; j < m; j++) {
		long long first = pq.top(); pq.pop();
		long long second = pq.top(); pq.pop();
		pq.push(first + second);
		pq.push(first + second);
	}
	long long ans = 0;
	while (!pq.empty()) {
		ans += pq.top();
		pq.pop();
	}
	printf("%lld\n", ans);
	return 0;
}


Tags:

Categories:

Updated: