那个题:2-5 修理牧场 (35分)
//bulid没有写,感觉有点乱,这俩操作还是边看边写的。。。
#include <iostream>
using namespace std;
typedef struct HeapNode *MinHeap;
struct HeapNode
{
int *data;
int size;
int capacity;
};
MinHeap CreatHeap(int MaxSize);
void Insert(MinHeap mh, int x);
int Delete(MinHeap mh);
int main()
{
MinHeap mh = CreatHeap(10001);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
int cur;
cin >> cur;
Insert(mh, cur);
}
int sum = 0;
for (int i = 0; i < N - 1; ++i)
{
int a = Delete(mh);
int b = Delete(mh);
sum += a + b;
Insert(mh, a + b);
}
cout << sum;
}
MinHeap CreatHeap(int MaxSize)
{
MinHeap mh = (MinHeap)malloc(sizeof(HeapNode));
mh->capacity = MaxSize;
mh->data = (int *)malloc(sizeof(int) * (MaxSize + 1));
mh->size = 0;
//哨兵
mh->data[0] = 0;
return mh;
}
void Insert(MinHeap mh, int x)
{
if (mh->size == mh->capacity)
return;
int idx = ++mh->size;
for (; mh->data[idx / 2] > x; idx /= 2)
mh->data[idx] = mh->data[idx / 2];
mh->data[idx] = x;
}
int Delete(MinHeap mh)
{
if (mh->size == 0)
return -1;
int data = mh->data[1];
int tmp = mh->data[mh->size--];
int parent, child;
for (parent = 1; parent * 2 <= mh->size; parent = child)
{
child = parent * 2;
if (child != mh->size && mh->data[child] > mh->data[child + 1])
child++;
if (tmp <= mh->data[child])
break;
else
mh->data[parent] = mh->data[child];
}
mh->data[parent] = tmp;
return data;
}