题目要求我们每次合并两个最小代价的集合,经过n次操作之后最后合并的只剩一个集合。
贪心
思想
总结:每次贪最小的两个集合,最后得到的总集合就是最小集合。
样例解析
code
首先,用户输入了一系列的数,然后将它们依次放入优先队列中。接下来,通过一个循环,不断地从优先队列中取出两个最小的数,将它们相加,并将结果再放回到优先队列中。这个过程会一直持续,直到队列中只剩下一个数为止。最后,将所有相加的结果输出。这个算法的目的是找到一种编码方式,使得所有数相加的总和最小。
#include <iostream>
#include<queue>
#include<vector>
using namespace std;
using ll=long long;
priority_queue<ll,vector<ll>,greater<ll>> pq; //小跟堆
int main()
{
int n=0;cin>>n;
for(int i=0;i<n;i++)
{
ll x;cin>>x; //数比较少,不需要开数组
pq.push(x);
}
ll ans=0;
while(pq.size()>1) //当堆不为空时
{
ll x=pq.top();pq.pop(); //获取最小值,弹出最小值
ll y=pq.top();pq.pop(); //弹出了最小的,剩下的就是次小的,把次小的获取完也弹出,以此类推
ans+=x+y; //将最小值和次小值相加
pq.push(x+y); //最小值和次小值相加的结果再放回堆里,方便下次循环接着计算
}
cout<<ans<<endl;
return 0;
}