题意及思路
- 题意:合并n种果子,每一次合并两堆,合并所需体力为果子的数量。问最小需要消耗多少体力?
- 思路:😉题意简单明了,可以每次选取剩下堆中,最小数量的两堆,即😃贪心做法。😏很简单的吧。具体实现见代码。下述代码1中,
priority_queue
为优先队列😄,下述代码1形式,自动将数据从小到大排序。最后,附上解法链接,戳下方链接。😉此外,我自己手写了一种类似于优先队列的代码。我的想法是,每次取完两个最小值后,🙂将他们的和插入到后面的位置上,便可以使得未合并的堆数值🙄整体有序。下述代码2中的arrange()实现了此功能。
- 收货:这题学到了c++的优先队列的概念,格式是 priority_queue<数据类型,存储容器类型, 优先的判定方式>。😆竞赛中c++还是比较友好的。
代码1
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q; //优先队列
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=1;i<=n;i++){
cin >> x;
q.push(x);
}
while(q.size()>=2){
int a = q.top();
q.pop();
int b = q.top();
q.pop();
ans += a+b;
q.push(a+b);
}
cout << ans << endl;
return 0;
} 代码2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int n,ans = 0,q[N];
void arrange(int id){
for(int i=id+1;i<=n;i++){
if(q[i]>=q[id]) break;
swap(q[i],q[id]);
id = i;
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=1;i<=n;i++){
cin >> q[i];
}
sort(q+1,q+1+n);
for(int i=2;i<=n;i++){
ans += q[i-1]+q[i];
q[i] = q[i-1]+q[i];
arrange(i);
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号