合成果子!
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
int n,x;
cin>>n;
priority_queue<ll,vector<ll>,greater<ll>>v;
for(int i=0;i<n;i++)
{
ll x;
cin>>x;
v.push(x);
}
ll ans=0;
for(int i=1;i<n;i++)
{
ll sum=0;
sum+=v.top();
v.pop();
sum+=v.top();
v.pop();
v.push(sum);
ans+=sum;
}
cout<<ans;
return 0;
}
本题知识点:
学会巧妙利用堆
大堆
priority_queue<ll>>v;
小堆
priority_queue<ll,vector<ll>,greater<ll>>v;
第k小
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
priority_queue<ll>v;
ll n,m,k,i,x,y,sum=0;
//因为优先队列<priority>无法像数组那样有其对应的索引值,因此我们需要控制里面的数量
//在这因为我们只要第k小的值,那么大于k的值都可以不用管,可以pop出去!
//这道题意在让我们简化思路
int main()
{
cin>>n>>m>>k;
for(i=0;i<n;i++)
{
cin>>x;
if(sum<k){
v.push(x);
sum++;
}else{
if(x<v.top())
{
v.pop();
v.push(x);
}
}
}
while(m--)
{
cin>>y;
if(y==1)
{cin>>x;
if(sum<k){
v.push(x);
sum++;
}else{
if(x<v.top())
{
v.pop();
v.push(x);}
}
}else if(y==2){
if(sum<k){
cout<<"-1\n";
}else{
cout<<v.top()<<"\n";
}
}
}
return 0;
}