http://tyvj.cn/p/1066
贪心地先把所有果子放进小根堆,然后取出两个最小值相加后再放进去,在此期间ans+=两个最小值的和,直到只剩1个元素停止
#include<cstdio>
#include<cstring>
using namespace std;
int heap[10005];
int hsize = 0;
int put(int x)
{
hsize++;
heap[hsize] = x;
int now, next = hsize;
while (next > 0)
{
now = next;
if (heap[now/2]>heap[now])
{
int t = heap[now/2];
heap[now/2] = heap[now];
heap[now] = t;
next = now / 2;
} else break;
}
}
int get()
{
int ret = heap[1];
heap[1] = heap[hsize--];
int now, next = 1;
while (next * 2 <= hsize)
{
now = next*2;
if (now + 1<hsize&&heap[now + 1]<heap[now])
now++;
if (heap[now/2]>heap[now])
{
int t = heap[now/2];
heap[now/2] = heap[now];
heap[now] = t;
next = now;
} else break;
}
return ret;
}
int main ()
{
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++)
{
int y;
scanf("%d", &y);
put(y);
}
int ans = 0;
while (hsize > 1)
{
int a = get();
int b = get();
ans += a+b;
put(a+b);
}
printf("%d\n", ans);
return 0;
}