#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#define INPUT
using namespace std;
const int MAXSIZE = 50010;
bool comp1(int a,int b)
{
return a>b;
}
int main()
{
#ifdef INPUT
freopen("b:\\acm\\poj3253\\input.txt","r",stdin);
#endif
long n;
while(scanf("%d",&n) != EOF )
{
long v[MAXSIZE] = {0};
unsigned long long res = 0;
// unsigned long long sum = 0;
long j = 0;
for(int i = 0 ; i < n; i++)
{
scanf("%ld",&v[i]);
}
//make_heap:[first,last),so v[n]
make_heap(&v[0],&v[n],comp1);
for(;n>1;n--)
{
//pop_heap assumes that [0..n) is already a heap
pop_heap(&v[0],&v[n],comp1);
//v[n-1] is now v[0],the heap is [0..n-1)
pop_heap(&v[0],&v[n-1],comp1);
//v[n-2] is now v[0],the heap is [0..n-2)
v[n-2] = v[n-2] + v[n-1];
//push_heap assumes [first,last-1) is a heap;
//it makes [first,last) a heap(push the last - 1)
//so,it pushes v[n-2]
push_heap(&v[0],&v[n-1],comp1);
res = res + v[n-2];
}
cout << res << endl;
///
}
return 0;
}
【poj3253】堆的应用
最新推荐文章于 2019-01-09 20:13:00 发布