蓝桥杯 1.谈判 贪心

103 阅读1分钟

1.谈判 - 蓝桥云课 (lanqiao.cn)

题目要求我们每次合并两个最小代价的集合,经过n次操作之后最后合并的只剩一个集合。

贪心

思想 image.png 总结:每次贪最小的两个集合,最后得到的总集合就是最小集合。

样例解析 image.png

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;
}