这个是堆的作法,速度很快,只有20ms左右,插排的那个要940-960ms
题面另一篇里有
#include<bits/stdc++.h>
using namespace std;
int siz,n,x,hp[10005],sm;
int p,q;
void pus(int x)
{
siz++;
hp[siz]=x;
int now=siz;
while(now>1)
{
if(hp[now]<hp[now>>1])
{
swap(hp[now],hp[now>>1]);
now=now>>1;//容易忘记
}
else break;
}
}
int del()
{
int res=hp[1];
hp[1]=hp[siz];siz--;
int now=1;
while(2*now<=siz)
{
int tp=2*now;
if(tp<siz && hp[tp]>hp[tp+1]) tp=tp+1;//如果左节点<总节点,说明有右节点
if(hp[now]>hp[tp])
{
swap(hp[now],hp[tp]);
now=tp;//容易忘记
}
else break;//当前节点比孩子都小,提前结束
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
pus(x);
}
// for(int i=1;i<=n;i++)
// printf("%d ",hp[i]);
// cout<<endl;
// del();
// for(int i=1;i<=siz;i++)
// printf("%d ",hp[i]);
for(int i=1;i<=n-1;i++)//n-1
{
p=del();
// cout<<p<<endl;
q=del();
// cout<<q<<endl;
sm+=p+q;
// cout<<sm<<endl;
if(hp[1]>0)
pus(p+q);
}
// for(int i=1;i<=n;i++){
// cout<<hp[i];
// }cout<<endl;
printf("%d\n",sm);
}