两个小时的泪水啊,http://poj.org/problem?id=3253,各种bug,下次做题前先思考久一点,免得和这次一样做没用的劳动<img alt="抓狂" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/crazy.gif" />
#include <stdio.h>
#define INF 50001
__int64 heap[INF],arr[INF], size = 0;
void push(__int64 x){
__int64 i = size++;
while(i > 0){
__int64 j = (i - 1) / 2;
if(heap[j] <= x) break;
heap[i] = heap[j];
i = j;
}
heap[i] = x;
}
__int64 pop(){
__int64 res = heap[0], temp = heap[--size];
__int64 i = 0;
while(i * 2 + 1 < size){
__int64 j = i * 2 + 1;
if(j + 1 < size && heap[j + 1] < heap[j]) j++;
if(heap[j] >= temp) break;
heap[i] = heap[j];
i = j;
}
heap[i] = temp;
return res;
}
int main(){
__int64 x,i,m,a,b;
__int64 temp,num=0;
scanf("%I64d",&m);
for(i=0;i<m;i++)
{
scanf("%I64d", &x);
push(x);
}
while(m!=1)
{
m--;
a=pop();
b=pop();
if(m!=1)
push(a+b);
num=num+a+b;
}
printf("%I64d",num);
return 0;
}