알고리즘 공부

백준 카드 정렬하기

컴퓨터과학 2023. 9. 28. 15:19

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

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

흠 그냥 우선순위 큐사용하면 쉽게 풀리는 문제네요 ;; 골드4 인데 너무 쉽네요 그리디인데... 우선순위 큐를 모르면 좀 어려웟을것 같네요.. 흠 이문제는 좀 애매한 문제네요 

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	//정렬된 두 묶음의 숫자 카드가 잇다고하자
	//각 묶음의 카드의 수를 a,b라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 a+b번의 비교를 해야한다
	//이를 테면 20장의 숫자 카드 묶음의 숫자 카드 묶음을 합ㅈ치려면 50번의 비교가 필요하다 
	//10 40
	//50
	//10+20 + 30 + 40 
	//10+40 + 50 + 20 
	int n;
	cin >> n;
	priority_queue<int,vector<int>,greater<int>>cards;
	for (int i = 0; i < n; i++) {
		int tmp;
		cin >> tmp;
		cards.push(tmp);
	}

	vector<int>anw;
	while (cards.size()!=1) {
		int first = cards.top();
		cards.pop();
		int next = cards.top();
		cards.pop();
		int sum = first + next;
		anw.push_back(sum);
		cards.push(sum);
	}
	int tsum = 0;
	for (int i = 0; i < anw.size(); i++) {
		tsum += anw[i];
	}
	cout << tsum;
	return 0;
}