美文网首页
[贪心]合并果子——落谷-P1090

[贪心]合并果子——落谷-P1090

作者: Melece | 来源:发表于2019-07-23 15:45 被阅读0次
优先队列

  优先队列中元素具有优先级,在删除时删除优先级高的元素。优先队列本质上还是队列,元素增添在队尾,取元素时取队首元素,在优先队列中只不过变成了取优先级最高的元素。优先队列内部排序的方式是堆排序,升序的优先队列就相当于一个小根堆。
头文件#include <queue>
升序队列priority_queue<int, vector<int>, greater<int> >, 其中greater<int>是STL中的结构体,表示数据从小到大进行输出。
降序队列priority_queue<int, vector<int>, less<int> >,其中less<int>是内置数据从数据从大到小进行输出。


思路

  分析题目可以知道每次取最小的两堆的果子,可以使得总花销最小,因此,使用优先队列存放果子的数量后,只需要每次从头取出两个值进行相加,这就是这一次合并的代价,从队列中删掉这两个值,因为已经搬运过了。再把合并好的存到队列中,供下次搬运,直到队列为空,也就是所有的果子都搬运完了。


AC代码
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int , vector<int>, greater<int> > p;
int n;
int ans = 0;

int main(){
    cin >> n;
    int temp;
    for(int i = 0; i < n; i++){
        cin >> temp;
        p.push(temp);       
    }
    //一次要合并两堆,当队列中只剩下两堆时,下一次操作就可以把所有的果子合并完
    while(p.size() >= 2){
        int a = p.top();
        p.pop();//删除一堆果子
        int b = p.top();
        p.pop();//删除另一堆果子
        int sum = a+b;
        ans += sum;
        p.push(sum);//将合并好的新果子放回到队列中
    }
    cout << ans << endl;
    return 0;
}

STL结构体排序的代码

greater<int>

template<class _Ty = void>
    struct less
    {    // functor for operator<
    typedef _Ty first_argument_type;
    typedef _Ty second_argument_type;
    typedef bool result_type;

    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator< to operands
        return (_Left < _Right);
        }
    };

less<int>

template<class _Ty = void>
    struct greater
    {    // functor for operator>
    typedef _Ty first_argument_type;
    typedef _Ty second_argument_type;
    typedef bool result_type;

    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator> to operands
        return (_Left > _Right);
        }
    };

自定义排序

struct Node{
    int x,y;
    Node(int a=0, int b=0):
        x(a), y(b) {}
};

struct cmp{
    bool operator()(Node a, Node b){
        if(a.x == b.x)  return a.y>b.y;
        return a.x>b.x;
    }
};

priority_queue<Node,vector<Node>,cmp>q;

相关文章

  • [贪心]合并果子——落谷-P1090

    优先队列   优先队列中元素具有优先级,在删除时删除优先级高的元素。优先队列本质上还是队列,元素增添在队尾,取元素...

  • 信息课总结(一)

    贪心与排序 一、合并果子(洛谷ojP1090) 原题是洛谷的P1090 合并果子思路:要使总共的和最小,则要使单次...

  • AcWing 148. 合并果子

    AcWing 148. 合并果子 哈夫曼/贪心

  • 合并果子

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了N堆。果园是一个二维平面,第i堆果子的位置为...

  • 合并果子问题

    第一时间想到取前两个元素相加然后insert进去再quicksort。结果.... 然后换个堆排序看看: 不懂为啥...

  • 贪心--合并区间

    目录[https://www.jianshu.com/p/85e18c21317a] 题号[https://lee...

  • 2020-09-11 合并果子 / [USACO06NOV] F

    https://www.luogu.com.cn/problem/P1090

  • 贪心十八:合并区间

    题目地址: https://leetcode-cn.com/problems/merge-intervals/[...

  • [算法] 贪心算法证明思路

    最优子结构 动态规划和贪心算法都需要问题具有最优子结构,但不同的是贪心自顶向下,先做选择再求解一个结果子问题,而动...

  • 贪心算法最优合并问题

    最优合并问题 给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路...

网友评论

      本文标题:[贪心]合并果子——落谷-P1090

      本文链接:https://www.haomeiwen.com/subject/jktalctx.html