【算法笔记】贪心专题

 int main(){
     sort(a,a+n);
     for(int i=0;i<n;i++)
         ans+=abs(a[i]-a[n/2]);
     cout<<ans;
 }

P7014 均分图书

算一下平均数,然后从第一堆开始每次把一堆搞成平均数。

感觉这里有点bug,其实是有可能出现第二堆的书全都移到第一堆也不够用的情况的,但是暂时还没想到怎么解决,先这样吧...

 int main(){
     sum=c/n; //计算平均数 
     for(int i=0;i<n;i++)
     {
         if(a[i]!=sum) //判断一下是否等于平均数,如果等于就直接下一次。 
         {
             a[i+1]=a[i+1]+(a[i]-sum); //移动纸牌 
             a[i]=sum; //移动过后就变成了平均数 
             d++; //移动次数增加一次 
         }
     }
     return d;
 }

P7015 合并果⼦

哈夫曼树的具象版,那就用构造哈夫曼树的方法来合并吧。

本解法用到了优先队列,因为构造过程不是简单的消耗元素,还会产生新的节点,我们需要在新的节点加入备选元素后,元素列表仍能保持有序,此时选择优先队列来存储备选元素是最合适的。

 int main(){
     priority_queue<int, vector<int>, greater<int>> heap;
     //把元素全插入该优先队列
     int res = 0;
     while (heap.size() > 1){//还没用完
         int a = heap.top(); heap.pop();//取两个最小的
         int b = heap.top(); heap.pop();
         res += a + b;//加起来
         heap.push(a + b);//新节点塞回去
     }
     return res;
 }
  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值