本题对c++党来说有个福利
STL里的优先队列 : priority_queue
具体用法参考以下链接:
priority_queue
本题链接
#include<bits/stdc++.h>
using namespace std;
int n, ans = 0;
priority_queue < int, vector <int>, greater <int> > q;
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
int x; cin>>x;
q.push(x);
}
while (q.size() > 1)
{
int x = q.top(); q.pop();//取第一小的堆,并将其删除
int y = q.top(); q.pop();//取第此时第一小的堆,并将其删除
ans += x + y;
q.push(x + y);//将合并后的堆加入堆顶
}
cout << ans << endl;
return 0;
}
本题核心代码:
while (q.size() > 1)
{
int x = q.top(); q.pop();//取第一小的堆,并将其删除
int y = q.top(); q.pop();//取第此时第一小的堆,并将其删除
ans += x + y;
q.push(x + y);//将合并后的堆加入堆顶
}
本题代码较为常见的错误为:
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int n;//果子堆数
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int sum = a[0];
for (int j =0; j<n-1; j++)
{
a[j] += a[j + 1];
sum += a[j];
}
cout << sum<< endl;
return 0;
}
结果是对的,但使用sort函数会超时,优先队列为最优解。