7-8 修理牧场 (25 分)

题目链接

7-8 修理牧场 (25 分)

参考资料

c++优先队列(priority_queue)用法详解

定义
priority_queue<Type, Container, Functional>

这三个参数,后面两个可以省略,第一个不可以。
Type 就是数据类型
Container就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。 STL里面默认用的是vector)
Functional就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆

//升序队列(小顶堆)
priority_queue <int,vector<int>,greater<int> > q;
//降序队列(大顶堆)队首元素最大,从队首到队尾 降序排列
priority_queue <int,vector<int>,less<int> >q;
==priority_queue <int>q;

//greater和less是std实现的两个仿函数
(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),
这个类就有了类似函数的行为,就是一个仿函数类了)


成员函数

假设type类型为int,则:

bool empty() const 返回值为true,说明队列为空;
int size() const 返回优先队列中元素的数量;
void pop() 删除队列顶部的元素,也即根节点
int top() 返回队列中的顶部元素,但不删除该元素;
void push(int arg) 将元素arg插入到队列之中;

代码参考

代码及个人理解

#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<queue>
using namespace std;
int main()
{
    
    
	//学习了一下别人的代码
	//说一下我的理解:
    //块数一定,那锯的刀数就一定,一次锯一刀,把一块分两块
	//因为价钱等于据的木块的长度,那就让每次两块和最少,每次用的钱就最少,把长度大的放后据
	//是哈夫曼树的思想,但是不一定要建哈夫曼树
	//式子就是sum=n1+n2+n3+...+n(n-1)/始每一块n尽可能的小,总和就尽可能的小

	priority_queue<int, vector<int>, greater<int>>q;
	int n;
	cin >> n;
	int sum = 0,k;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> k;
		q.push(k);//按大小顺序入队
	}
	while (n>1)//需要n块,那就锯n-1刀
	{
    
    
		int temp_sum = 0;
		temp_sum += q.top();
		q.pop();
		temp_sum += q.top();
		q.pop();
		sum += temp_sum;
		q.push(temp_sum);
		n--;
	}
	cout << sum;
}

猜你喜欢

转载自blog.csdn.net/weixin_50816938/article/details/117162790