合并果子
题目链接:题目
思路:首先看到这题就开始的想法是每次进行一次排序,拿出两个最小的,合并后再丢进去。然后重复操作…..但是这样写每次都要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库也是蛮好的一件事
*/
}