목장 수리 (25 점) (단순 우선 순위 대기열)

농부는 목장의 울타리 일부를 수리하려고합니다. 그는 울타리를 측정 한 결과 N 개의 나무 조각이 필요함을 발견했습니다. 나무 조각의 길이는 정수 리입니다. , 즉, 나무의 길이는 리튬의 합이다.

그러나 농부는 자신이 톱을 가지고 있지 않으며 누군가를 사용하여 나무를 본 것에 대한 보상은 나무의 길이에 비례합니다. 단순성을 위해 톱질 한 나무의 길이와 동일한 보상을 설정하십시오. 예를 들어, 길이가 8, 7, 5 인 3 개의 세그먼트로 20 개의 나무 길이를 톱질하려면 처음으로 목재를 톱질하는 비용은 20, 목재는 12, 8, 두 번째 톱질의 비용은 12, 길이는 12입니다. 나무를 7과 5로 자르면 총 비용은 32입니다. 목재를 처음으로 15 번과 5 번으로 톱질하는 경우 두 번째 톱질 비용은 15이고 총 비용은 35 (32 이상)입니다.

농부가 나무를 N 조각으로 자르는 데 드는 최소 비용을 계산하는 데 도움이되는 프로그램을 작성하십시오.

입력 형식 :
입력은 먼저 양의 정수 N (≤10 4)을 제공하며, 이는 목재를 N 조각으로 절단해야 함을 의미합니다. 두 번째 줄은 N 개의 양의 정수 (≤50)를 제공하여 각 나무 조각의 길이를 나타냅니다.

출력 형식 :
정수, 즉 목재를 N 조각으로 자르는 데 드는 최소 비용을 출력합니다.

여기에 사진 설명 삽입

질문 아이디어

1. 욕심 많은 알고리즘에 따르면 비용이 전체적으로 가장 적게 도달 할 때마다 가장 적은 비용을 지출하려는 경우 이러한 종류의 문제는 우선 순위가 조정 된 우선 순위 대기열을 사용하여 Huffman을 시뮬레이션 할 수 있습니다. 나무.
2. 기본 데이터 유형의 우선 순위 큐 우선 순위 조정 priority_queue <ElemType, Vector <ElemType>, gerater <ElemType >> que; 또한 데이터 유형이 구조 인 경우 다른 기사에서 관심이있는 경우 살펴볼 수 있습니다. 그런데 해당 연습을 수행하고 구조 우선 순위 대기열의 우선 순위를 조정합니다.

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

int main()
{
    
    
	priority_queue<int, vector<int>, greater<int>> HuffmanTree;	//数越小优先级越高,换成less<int>就是数值越大权值优先级越高

	int n, t;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> t;
		HuffmanTree.push(t);
	}

	int sum = 0;
	while (HuffmanTree.size() != 1)
	{
    
    
		int t1, t2;				//让数值最小的先出队
		t1 = HuffmanTree.top();
		HuffmanTree.pop();
		t2 = HuffmanTree.top();
		HuffmanTree.pop();
		sum += t1 + t2;
		HuffmanTree.push(t1+t2);	//将新的节点加入到优先队列中
	}

	cout << sum;
}

추천

출처blog.csdn.net/xdg15294969271/article/details/114000344