2004

合并果子

题目链接:题目

思路:首先看到这题就开始的想法是每次进行一次排序,拿出两个最小的,合并后再丢进去。然后重复操作…..但是这样写每次都要sort一次,数据一大不免会超时。所以就优先队列写是正解,当然针对于这一题还可以set库中的multiset来写

代码:

//优先队列写法!!!!!!!!!!!!!!!!!!!
#include <iostream>
#include <queue>
using namespace std;

//Statement_common
int n,ans;
int a[10001];
priority_queue<int> zhou;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],zhou.push(-a[i]);

    for(int i=1;i<=n-1;i++)
    {
        int c=0,cc=0,ccc=0;

        //大小根堆的转换
        c=-zhou.top(),zhou.pop();
        cc=-zhou.top(),zhou.pop();
        ccc=c+cc;

        ans+=ccc,zhou.push(-ccc);
    }

    cout<<ans;
    return 0;
}
//注意,优先队列默认初始化为大根堆,即从大到小,所以乘1个-1转换成小根堆
//set库multiset写法!!!!!!!!!!!!!!!!
#include <iostream>
#include <set>
using namespace std;

//Statement_common
int n,ans;
int a[10001];
multiset<int> zhou;

int main()
{
    freopen("fruit.in","r",stdin);
    freopen("fruit.out","w",stdout);

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],zhou.insert(a[i]);

    for(int i=1;i<=n-1;i++)
    {
        int c=0,cc=0,ccc=0;
        c=*zhou.begin();
        zhou.erase(zhou.begin());

        cc=*zhou.begin();
        zhou.erase(zhou.begin());

        ccc=c+cc,ans+=ccc;
        zhou.insert(ccc);
    }

    cout<<ans;
    return 0;
    /*
    这题之所以用set库是利用了set中multiset多重集合的重复性,即可以存在有
    重复的元素。而且,set和multiset可以自动排序(从小到大),这一点很重要,
    这一题正是利用了这点。并且效率并超越sort,所以不会TLE。
    至于为什么效率快,查了一下资料,如下解释:

        set的含义是集合,它是一个有序的容器,里面的元素都是排序好的。
        支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是
        严格在logn时间之内完成,效率非常高。

        为什么是logn呢?
        因为set和multiset都是基于红黑树实现的。

    好吧现在红黑树好像是什么平衡二叉树什么东西的,没有深究....(先用着先)
    总之来说掌握STL中的set库也是蛮好的一件事
    */
}

补充:优先队列(queue)和multiset(set)相关知识可以转到我的STL总结去学习


猜你喜欢

转载自blog.csdn.net/qq_39824819/article/details/80659216