33,007
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <queue>
using namespace std;
int N;
int woods[20001];
int main()
{
int i, j;
while (cin >> N)
{
for (i=0; i<N; i++)
cin >> woods[i];
priority_queue<int, vector<int>, greater<int> > q(woods, woods+N);
unsigned int sum = 0;
while (q.size() >= 2)
{
i = q.top();
q.pop();
j = q.top();
q.pop();
sum += i+j;
q.push(i+j);
}
q.pop();
cout << sum << endl;
}
}
#include <iostream>
using namespace std;
unsigned int stones[20008];
void adjust(unsigned int n, unsigned int num)
{
unsigned int root, lchild, rchild, min, temp, tag;
while (n*2 <= num)
{
root = stones[n];
lchild = stones[n*2];
rchild = stones[n*2+1];
if (n*2+1 > num)
{
tag = 1;
min = lchild;
}
else
{
tag = lchild < rchild ? 1 : 0;
min = lchild < rchild ? lchild : rchild;
}
if (min < root)
{
if (tag)
{
temp = stones[n];
stones[n] = stones[2*n];
stones[2*n] = temp;
n = 2*n;
}
else
{
temp = stones[n];
stones[n] = stones[2*n+1];
stones[2*n+1] = temp;
n = 2*n+1;
}
}
else
{
break;
}
}
}
void buildHeap(unsigned int n)
{
unsigned int i;
for (i = n/2; i >= 1; i--)
adjust(i, n);
}
int main()
{
unsigned int num, i, total, temp, pre, next;
memset(stones, 0, sizeof(unsigned int)*10008);
cin >> num;
for (i = 1; i <= num; i++)
cin >> stones[i];
if (num == 1)
{
cout << "0" << endl;
return 0;
}
buildHeap(num);
total = 0;
for (i = 0; i < num - 1; i++)
{
pre = stones[1];
temp = stones[1];
stones[1] = stones[num-i];
stones[num-i] = temp;
adjust(1,num-i-1);
next = stones[1];
total += pre + next;
stones[1] = pre + next;
adjust(1,num-i-1);
}
cout << total <<endl;
return 0;
}