使用STL中的優先隊列處理“合併果子”問題

問題描述:

有n堆果子,每堆果子質量已知,現在需要把這些果子合併成一堆,但是每次只能把兩堆果子合併到一起,同時會消耗與兩堆果子質量之和等值的體力。顯然,在進行n-1次合併之後,就只剩下一堆了。爲了儘可能節省體力,請設計出合併的次序方案,使得耗費的體力最少,並給出消耗的體力值。

例如:3堆果子,質量一次爲1,2,3。則最少消耗的體力爲:先合併1和2,消耗3體力;然後合併3和3,耗費6體力,總共耗費9體力。

解題思路:每次都找當前堆中擁有最小的質量的兩堆果子,合併之。然後繼續上一步操作,直到剩餘果子只有一堆。

可使用C++中的優先隊列來實現,每次都取小頂堆的首部元素,取兩次,然後合併,累加求和。

代碼實現如下:

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

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

int main()
{
	int n;
	long long temp;
	scanf("%d", &n);
	for (int i = 0; i < n; ++i)
	{
		scanf("%lld", &temp);
		q.push(temp);
	}

	long long t1, t2, ans = 0;
	while (q.size() > 1)
	{
		t1 = q.top();
		q.pop();

		t2 = q.top();
		q.pop();

		q.push(t1 + t2);
		ans += t1 + t2;
	}
	printf("%lld", ans);
	return 0;
}

數據測試:

5
1 2 1 2 3
20

謝謝閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章